type SomeFunc = (name:string, age:number = 12) => void
//以上代码报错:只允许在函数或构造函数实现中使用参数初始化表达式。
为什么会这样呢,为什么只允许在实现中使用参数初始化呢?
如果我的函数定义和实现是分开的,要如何定义参数默认值呢?
type SomeFunc = (name:string, age:number = 12) => void
//以上代码报错:只允许在函数或构造函数实现中使用参数初始化表达式。
为什么会这样呢,为什么只允许在实现中使用参数初始化呢?
如果我的函数定义和实现是分开的,要如何定义参数默认值呢?
因为抽象函数不能有函数体,默认参数只有在有函数体的情况下才能实现。
type SomeFunc = (name:string, age?:number) => void
const Func:SomeFunc=(name:string,age:number=2)=>{
console.log(name,age)
}
Func('haha')
8 回答4.9k 阅读✓ 已解决
6 回答3.6k 阅读✓ 已解决
5 回答2.9k 阅读✓ 已解决
5 回答6.5k 阅读✓ 已解决
4 回答2.3k 阅读✓ 已解决
4 回答2.8k 阅读✓ 已解决
3 回答2.5k 阅读✓ 已解决
先得建立一个概念:TypeScrtip 分为“类型”和“值”两部分,其中类型是会在编译后被擦除的,因为 JS 不支持。类型和值也可以看作声明和实现。
多数情况下,类型和值区分很明显,比如
const a: number = 0
这里 a 的类型是 number,值是 0,如果擦除类型在 JS 中就是const a = 0
。但是也有一些东西在 TS 里是混在一起的,比如
enum
和class
就是类型和值混在一起的(class 在 JS 中也存在类型的概率,但不是很明显)。回头来说默认参数的问题,如果下图这样定义一个函数,它也是一个类型(Tip)和值(右边)混合的定义。可以看出来类型中没有默认值,但值部分是有默认值的。
但
type xxx = xxxxxx
就是一个纯类型定义,纯类型定义中不能出现值的部分。默认参数本质是可选的,只有在实现的时候才知道它在没有给的时候,函数会给他一个什么样的值(或者不给)。虽然 TypeScript 现在对默认参数的校验比较宽松(只校验是否可选)但仍然有升级的空间,比如(未实现),希望将来能有这样的约束。