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