let items = [1,2,3];// 符合要求items.forEach((item,index,arr) =>console.log(item));// 但是最常见的是会省略不用的参数items.forEach((item) =>console.log(item));
1.2.2 返回值兼容
letx= () => ({name:'Alice'});lety= () => ({name:'Alice', location:'Seattle'});x = y; // OKy = x; // Error, because x() lacks a location property// 要求y中的返回值,x都要能返回. 这与参数兼容不一样
2. 枚举之间的兼容性
枚举类型与数字类型兼容,数字类型与枚举类型兼容. 但是枚举类型之间是不兼容的。
enum Status { Ready, Waiting }
enum Color { Red, Blue, Green };
let status1:number = Status.Ready; // 数字类型与枚举类型兼容
status1 = Color.Red; // 错误, 不同枚举类型不兼容
3. 类
类与对象字面量和接口差不多,除了:类有静态部分和实例部分的类型。
比较两个类类型的对象时,只有实例成员会被比较,静态成员和构造函数不在比较范围内。
classAnimal { feet:number;constructor(name:string) {}}classSize { feet:number;constructor(feetNum:number) {}}let a:Animal;let s:Size;a = s; // OK s = a; // OK// 因此对于Animal和Size来说,都有feet属性,而constructor方法虽然不一样,但是不会被比较
4. 泛型
类型参数只影响使用其作为类型一部分的结果类型:
interface Empty<T> {
}
let x: Empty<number>;
let y: Empty<string>;
x = y; // OK, because y matches structure of x
因为虽然T最终的类型不一样,但是最终的interface并没有使用到T
interface NotEmpty<T> {
data: T;
}
let x: NotEmpty<number>;
let y: NotEmpty<string>;
x = y; // Error, because x and y are not compatible
因为T最终的类型不一样,且最终的interface使用到了T,所以会不兼容