关于typescript:用一个例子讲解typescript是结构类型系统

40次阅读

共计 1138 个字符,预计需要花费 3 分钟才能阅读完成。

首先抛出一个概念
TypeScript 是构造类型零碎,类型之间的比照只会比拟它们最终的构造,而会疏忽它们定义时的关系。
下面这句话值得咀嚼

上面举栗阐明这件事 上代码

interface Animal {name: string;}

let animal: Animal = {
    name: 'Tom',
    run: () => { console.log('run') }
};


下面这段代码是有问题的 也是毋庸置疑的 再看上面这段

interface Animal {name: string;}
interface Cat {
    name: string;
    run(): void;}

let tom: Cat = {
    name: 'Tom',
    run: () => { console.log('run') }
};
let animal: Animal = tom;

下面这段代码是没问题的 是不是让人很吃力 上面我试图用一个故事解释下这个景象

long long ago, 在 JS 王国里,有一个国王,他感觉世界上最美好的声音就是鸭子的叫声,于是国王招集大臣,要组建一个 1000 只鸭子组成的合唱团。大臣们找遍了全国,终于找到 999 只鸭子,然而始终还差一只,最初大臣发现有一只十分特地的鸡,它的叫声跟鸭子截然不同,于是这只鸡就成为了合唱团的最初一员。

于是大家定义了鸭子类型,“如果它走起来像鸭子,而且叫起来像鸭子,那么它就是鸭子”。
而后再联合上面这句话
TypeScript 是构造类型零碎,类型之间的比照只会比拟它们最终的构造,而会疏忽它们定义时的关系。
失去论断
第一段代码 大臣们找到的鹅啊啥的并没有鸭子的叫声 是进不去乐队的 所以零碎报错了
第二段代码 大臣们找到的这只鸡 (类型之间的比照) 是有鸭子的叫声(只会比拟它们最终的构造) 所以零碎没报错

上面在用个栗子阐明下为什么要这样做

interface Animal {name: string;}
interface Cat {
    name: string;
    run(): void;}

let animal: Animal = {name: 'Tom',};
let tom: Cat = animal;


这段代码跟第二段代码比照 let tom: Cat = animal;自身 Cat 类型的 tom 是具备 run 的能力的 然而被赋值成 Animal 类型的 animal 后就会失去 run 这个能力 必然会影响后续的应用 故 ts 提前抛出谬误 而let animal: Animal = tom;Animal 类型的 animal 所具备的 name Cat 类型的 tom 也是具备的 所以就算被赋值也不会影响后续的应用

最初借用他人总结的话
animal 断言为 Cat,只须要满足 Animal 兼容 CatCat 兼容 Animal 即可
animal 赋值给 tom,须要满足 Cat 兼容 Animal 才行

正文完
 0