Typescript的结构化类型系统

1,354 阅读1分钟

Typescript的结构性子类型是根据Javascript代码的典型写法来设计的。 因为Javascript里广泛的使用匿名对象,例如函数表达式和对象字面量,所以使用结构类型系统来描述这些类型比使用名义类型系统更好 Typescript结构化类型的基本原则是:如果x要兼容y,那么y至少要具有与x相同的属性
如下代码:

interface Named{
    name:string;
}
let x:Named;
let y = {name:"paodan",age:12}// y's inferred type is {name:string,age:number}
x = y
console.log(x)//{name:"paodan",age:12}

这里要检查y是否能赋值给x,编译器检查x中的每个属性,看是否在y中也能找到对应属性。 在上面的例子中,y必须包含名字是name的string类型成员。y满足条件,因此,赋值正确。

interface Named{
    name:string;
}

function greet(n:Named){
    console.log('Hello,'+n.name)//Hello,paodan
}
let y = {
    name:'paodan',
    age:13
}
greet(y)

上面代码能正确打印出结果:Hello,paodan
虽然y有个额外的age属性,但这不会引发错误。
只有目标类型(这里是Named)的成员会被一一检查是否兼容。
这个比较过程是递归进行的,检查每个成员及子成员。