typescript为什么只允许在函数或构造函数实现中使用参数初始化表达式?

type SomeFunc = (name:string, age:number = 12) => void
//以上代码报错:只允许在函数或构造函数实现中使用参数初始化表达式。

为什么会这样呢,为什么只允许在实现中使用参数初始化呢?
如果我的函数定义和实现是分开的,要如何定义参数默认值呢?

阅读 2.6k
3 个回答

先得建立一个概念:TypeScrtip 分为“类型”和“值”两部分,其中类型是会在编译后被擦除的,因为 JS 不支持。类型和值也可以看作声明和实现。

多数情况下,类型和值区分很明显,比如 const a: number = 0 这里 a 的类型是 number,值是 0,如果擦除类型在 JS 中就是 const a = 0

但是也有一些东西在 TS 里是混在一起的,比如 enumclass 就是类型和值混在一起的(class 在 JS 中也存在类型的概率,但不是很明显)。

回头来说默认参数的问题,如果下图这样定义一个函数,它也是一个类型(Tip)和值(右边)混合的定义。可以看出来类型中没有默认值,但值部分是有默认值的。

image.png

type xxx = xxxxxx 就是一个纯类型定义,纯类型定义中不能出现值的部分。默认参数本质是可选的,只有在实现的时候才知道它在没有给的时候,函数会给他一个什么样的值(或者不给)。

虽然 TypeScript 现在对默认参数的校验比较宽松(只校验是否可选)但仍然有升级的空间,比如(未实现),希望将来能有这样的约束。

type Func = (a:number = 3) => void;

const f1: Func = (a: number = 3) => void;  // OK
const f2: Func = (a?: number) => void;     // Err,不匹配默认参数设置

这种就直接声明函数就行,不用定义类型

function someFunc (name: string, age: number = 12) {
  
}

因为抽象函数不能有函数体,默认参数只有在有函数体的情况下才能实现。

type SomeFunc = (name:string, age?:number) => void

const Func:SomeFunc=(name:string,age:number=2)=>{
  console.log(name,age)
}

Func('haha')
推荐问题
logo
Microsoft
子站问答
访问
宣传栏