您的位置:首页 > Web前端 > JavaScript

TypeScript与JavaScript不同之处系列(七) ===>类型推论, 类型兼容性

2020-04-05 07:15 561 查看

本系列目的: 列出TypeScript与JavaScript的不同点, 缩小文档内容, 提高学习速度. 原文档地址: https://www.tslang.cn/index.html

全系列目录

文章目录

  • 2. 类型兼容性
  • 1. 类型推论

    1.1. 基本

    let x = 3; // 推断x为数字
    
    let zoo = [new Rhino(), new Elephant(), new Snake()]; // 推断为联合数组类型 (Rhino | Elephant | Snake)[]

    2. 类型兼容性

    一. typeScript里的类型兼容性是基于结构子类型的。 结构类型是一种只使用其成员来描述类型的方式. typeScript里的类型兼容性是基于结构子类型的。 结构类型是一种只使用其成员来描述类型的方式.

    // 例1:
    interface Named {
    name: string;
    }
    
    let x: Named;
    let y = { name: 'Alice', location: 'Seattle' };
    x = y;

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

    二.

    // 例2
    let x = (a: number) => 0;
    let y = (b: number, s: string) => 0;
    
    y = x; // OK
    x = y; // Error

    要查看x是否能赋值给y,首先看它们的参数列表。 x的每个参数必须能在y里找到对应类型的参数。 注意的是参数的名字相同与否无所谓,只看它们的类型。 这里,x的每个参数在y中都能找到对应的参数,所以允许赋值。

    第二个赋值错误,因为y有个必需的第二个参数,但是x并没有,所以不允许赋值。

    三.
    枚举类型与数字类型兼容,并且数字类型与枚举类型兼容。不同枚举类型之间是不兼容的。比如,

    // 例3
    enum Status { Ready, Waiting };
    enum Color { Red, Blue, Green };
    
    let status = Status.Ready;
    status = Color.Green;  // Error

    四.
    类与对象字面量和接口差不多,但有一点不同:类有静态部分和实例部分的类型。 比较两个类类型的对象时,只有实例的成员会被比较。 静态成员和构造函数不在比较的范围内。

    class Animal {
    feet: number;
    constructor(name: string, numFeet: number) { }
    }
    
    class Size {
    feet: number;
    constructor(numFeet: number) { }
    }
    
    let a: Animal;
    let s: Size;
    
    a = s;  // OK
    s = a;  // OK

    这两节感觉挺无聊的就放在一起写了, 详情请见https://www.tslang.cn/docs/handbook/type-compatibility.html

    • 点赞
    • 收藏
    • 分享
    • 文章举报
    刘翾 博客专家 发布了167 篇原创文章 · 获赞 275 · 访问量 59万+ 他的留言板 关注
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: