一. 类型推断
1. 基础
x被推断为number类型
let x = 3;
console.log('x', typeof x);
2. 最佳通用类型
最佳通用类型是算法计算出一个类型能兼容所有候选类型的类型;
若不能找到兼容所有候选类型的类型,则使用联合类型
let x = [0, 1, null];
// 在ts中联合类型写法(下面是联合数组类型)
let y: (number | null)[] = [0, 1, null];
3.上下文类型
根据上下文环境推断类型,当类型明确指定的时候,不会使用上下文环境推断.
上下文归类会在很多情况下使用到。 通常包含函数的参数,赋值表达式的右边,类型断言,对象成员和数组字面量和返回值语句。 上下文类型也会做为最佳通用类型的候选类型.
window.onmousedown = function (mouseEvent) {
console.log(mouseEvent);
}
二. 类型兼容性
typescript是结构化类型系统,不同于Java的基于名义类型系统,结构化类型系统是根据其成员来描述其系统的(如对象中的属性决定其类型).
类型兼容与否官方解释:
要检查y是否能赋值给x,编译器检查x中的每个属性,看是否能在y中也找到对应属性.
个人理解是:
将y赋值给x,y一定要包含x,这样才能保证x中所需要的属性都有.
interface Named {
name: string;
}
let x: Named;
let y = {name: 'Alice', location: 'Seattle'};
x = y;
1. 函数比较和复制
(1) 参数列表不同
xx能赋值给yy,此时应将xx和yy的参数列表做对比,xx包含于yy,相当于舍弃了本来yy函数中的s参数,这在JavaScript中是允许的; 但是,yy赋值给xx,按照如上的步骤,xx需要1个参数,却传入了多余参数,翻译成JavaScript不会报错,但是ts不允许.
let xx = (a: number) => 0;
let yy = (b: number, s: string) => 0;
yy = xx;
// xx = yy;
(2)返回值类型不同
类型系统强制源函数的返回值类型必须是目标函数返回值类型的子类型
let xxx = () => ({name: 'Alice'});
let yyy = () => ({name: 'Alice', location: 'Seattle'});
xxx = yyy; // OK
// yyy = xxx; // Error because x() lacks a location property
网友评论