TypeScript学习(七)TypeScript中的类型

1.类型推断

(1)基本类型推断

   在TypeScript中,通常没有明确指明类型的地方,类型推断机制会自动推断出变量或函数的类型。

let x = 1; // 推断为number
let str = "str"; // 推断为string
let arr = []; // 推断为Array
let num = (num:string) => num; //推断为string 

(2)最佳通用类型

   基本类型推断通常作用于初始化对象成员,设置默认参数和决定返回值的时候,而当需要从几个表达式之间推断类型时,会使用这些表达式的类型来推断出一个最佳通用类型。

let x = [0, 1, null]; // 推断为 number|null
let zoo = [new Rhino(), new Elephant(), new Snake()]; // 推断为(Rhino | Elephant | Snake)[]

(3)上下文类型

   按上下文归类推断通常会发生在表达式的类型与所处位置相关时。上下文通常包含函数的参数,赋值表达式的右边,类型断言,对象成员和数组字面量和返回值语句。上下文类型也会作为最佳通用类型的候选类型。

window.onmousedown = function(mouseEvent) { 
    // 此时会根据window.onmousedown的参数类型来推断mouseEvent的参数类型
    console.log(mouseEvent.button);
}

2.类型兼容性

   TypeScript里的类型兼容性是基于类型子结构的,结构类型是一种只使用其成员来描述类型的方式,它正好与名义类型相反。

interface Named {
    name: string;
}

class Person {
    name: string;
}

let p:Named;
p = new Person();

   在基于名义类型的语言中,这段代码会报错,因为Person和Named之间没有直接或间接的联系。而在TypeScript中,也就是基于结构类型的语言中,这样是可以通过的,因为Named和Person都具有相同的结构即类型为string的name属性。

(2)结构化类型的基本规则

   如果x要兼容y,那么y至少要和x有相同的属性。检查函数的时候同样也是这个规则。同时,在对两个函数之间进行相互比较的时候,还会比较参数的数量和类型,同时源函数的返回值必须是目标函数返回值的子类型。

interface A {
    a: string;
}

interface B {
    a: string;
    b: number;
}

let a = new A();
let b = new B();
a = b; // 没问题,因为B类型中有a: string属性
b = a; // Error!因为A类型中没有b: number属性

(3)函数参数双向协变

   当比较函数参数类型时,只有当源函数参数能够赋值给目标函数或者反过来时才能赋值成功。

(4)可选参数和剩余参数

   比较函数兼容性时,可选参数与必须参数是可以互换的。源类型上有额外的可选参数不是错误,目标类型的可选参数在源类型上没有对应参数也不是错误。当一个函数有剩余参数时,会被当做有无数个可选参数。

(5)函数重载

   对于有重载的函数,源函数的每个重载都要在目标函数上找到对应的函数签名。这确保了目标函数可以在所有原函数可调用的地方调用。

3.枚举

   枚举类型和数字类型兼容,并且数字类型与枚举类型兼容。但是,枚举类型之间不兼容。

enum Status { Ready, Waiting };
enum Color { Red, Blue, Green };

let status = Status.Ready;
status = Color.Red; // Error

4.类

   类有静态部分和实例部分的类型,因此在比较的时候,只会比较实例成员。如果目标类型包含一个私有成员,那么源类型必须包含来自同一个类的这个私有成员。这允许子类型赋值给父类型,但不允许赋值给其他拥有同样类型的类。

5.泛型

   因为TypeScript是结构性的类型系统,类型参数只影响使用其做为类型一部分的结果类型。当没有指定泛型的类型时,所有参数都会被当成any进行比较。

interface Empty<T> {}
let x: Empty<number>;
let y: Empty<string>;
x = y; // 这是正确的,因为x和y的结构并无二致

interface Temple<T> {
	data: T;
}
let a: Temple<number>;
let b: Temple<string>;
a = b; // 错误,data属性的类型不一致
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

volit_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值