TypeScript学习-Type Inference
2017-07-01 本文已影响48人
指尖泛出的繁华
Basics
以下几种情况,TypeScript会发生类型推理。
- 变量或成员的初始化
- 给参数的赋予默认值
- 确定函数返回值
Best common type
如果要从几个表达式里面推断类型,TypeScript会从这些表达式里面计算一个best common type
用于最终的类型。
打个比方,如果一个数组。如下
let x = [0, 1, null];
TypeScript使用best common type algoithm
维护一个candidate
队列,每个成员的类型加入candidate
队列,然后选出一个与其他candidate
成员最兼容的类型。所以上面x
的类型推断为number[] & Array<number>
如果几个表达式所代表的类型组成的candidate
类型势均力敌,那么无法推断,所以需要自己明确指出类型。
let zoo: Animal[] = [new Rhino(), new Elephant(), new Snake()];
Contextual Type
当发生赋值函数的情况,TypeScript能使用Contextual Type
,来推断在对应Contextual Type Position
上的类型,如果如果函数表达式中参数不在对应的Contextual Type Position
,且没有显式设置,那么想相应的参数类型就会为any
,如下。
window.onmousedown = function(mouseEvent: any) {
// function(handler, ...) 所以mouseEvent无法推断
console.log(mouseEvent.buton); //<- Now, no error is given
};
以下几种情况会发生Contextual Type
- 函数调用中的语句
- 等号右侧赋值
- 类型断言
type assertions
- 对象或者数组字面量的成员
- 返回语句
function createZoo(): Animal[] {
return [new Rhino(), new Elephant(), new Snake()];
}