作者回复: type:不创建新的类型,只是给一个类型起一个名字,比如联合类型,写起来不方便,用type定义后就很简洁,你可以把type当做一种快捷访问方式;
interface:创建新的类型,接口之间还可以继承(type不可以)。如果可能,建议优先使用 interface。
另外纠正你的一个理解,接口中的属性没有顺序之分,混合接口不需要第一个属性是匿名函数。
作者回复: 剩余参数表示参数个数不确定,不传是可以的,函数返回的是 undefined。可以加入判断 undefined 的逻辑:
if (typeof first === 'undefined') {
throw new Error('No param')
}
作者回复: 函数重载一般在实现时用any类型,如果一定要这么些,有两个报错要处理:
1)返回值类型加上undefined
2)第二个分支,给rest加上类型断言 (rest as number[]),ts只推断了first,rest类型还是 number[]|string[],不符合reduce的接口声明
作者回复: 这是函数类型的定义,调用前还需要有实现,比如:addFun = (a, b) => a + b;
然后再调用:addFun(1, 2)
作者回复: 视频中没有处理参数未定义的情况,你这样处理可以。
ts中对分号结尾没有要求,这个全看个人风格。
作者回复: 第一个参数是undefined应该报错,仔细看一下,或重启一下VSCode
作者回复: 为啥用函数重载,请见本节我对 火云邪神0007 的回复。
因为不是很方便,函数重载在实际应用中使用的比较少,一般会用联合类型或泛型代替。
另外,函数重载的声明只用于类型检查阶段,在编译后会被删除。
作者回复: 我们的目的不是为了跑通,而要理解函数重载的意义,前两条声明是重载,目的是将参数类型约束为 number 或 string;最后的实现不是重载,要遵循前面的声明,比如传 boolean 就不可以了。
作者回复: if (typeof first === 'number') 已经保证了rest 不会是空数组
作者回复: 这是定义一个函数类型,函数实现可基于此类型。