TypeScript躬行记(6)——高级类型

本节将对TypeScript中类型的高级特性做详细讲解,包括交叉类型、类型别名、类型保护等。

一、交叉类型

交叉类型(Intersection Type)是将多个类型通过“&”符号合并成一个新类型,新类型将包含所有类型的特性。例如有Person和Programmer两个类(如下代码所示),当man变量的类型声明为Person&Programmer时,它就能使用两个类的成员:name属性和work()方法。

class Person {name: string;
}
class Programmer {work() { }
}
let man: Person&Programmer;
man.name;
man.work(); 

交叉类型常用于混入(mixin)或其它不适合典型面向对象模型的场景,例如在下面的示例中,通过交叉类型让新对象obj同时包含a和b两个属性。

function extend<T, U>(first: T, second: U): T & U {const result = <T & U>{};for (let prop in first) {(<T>result)[prop] = first[prop];}for (let prop in second) {if (!result.hasOwnProperty(prop)) {(<U>result)[prop] = second[prop];}}return result;
}
let obj = extend({ a: 1 }, { b: 2 }); 

二、类型别名

TypeScript提供了type关键字,用于创建类型别名,可作用于基本类型、联合类型、交叉类型和泛型等任意类型,如下所示。

type Name = string;//基本类型
type Func = () => string;//函数
type Union = Name | Func;//联合类型
type Tuple = [number, number]; //元组
type Generic<T> = { value: T };//泛型 

注意,起别名不是新建一个类型,而是提供一个可读性更高的名称。类型别名可在属性里引用自身,但不能出现在声明的右侧,如下所示。

type Tree<T> = {value: T;left: Tree<T>;right: Tree<T>;
}
type Arrs = Array<Arrs>;//错误 

三、类型保护

当使用联合类型时,只能访问它们的公共成员。假设有一个func()函数,它的参数是由Person和Programmer两个类组成的联合类型,如下代码所示。

function func(man: Person | Programmer) {if((<Person>man).run) {(<Person>man).run();}else {(<Programmer>man).work();}
} 

虽然利用类型断言可以确定参数类型,在编译阶段避免了报错,但是多次调用类型断言未免过于繁琐。于是TypeScript就引入了类型保护机制,替代类型断言。类型保护(Type Guard)是一些表达式,允许在运行时检查类型,缩小类型范围。

1)typeof

TypeScript可将typeof运算符识别成类型保护,从而就能直接在代码里检查类型(如下所示),其计算结果是个字符串,包括“number”、“string”、“boolean”或“symbol”等关键字。

function send(data: number | string) {if (typeof data === "number") {//...} else if(typeof data === "string") {//...}
} 

2)instanceof

TypeScript也可将instanceof运算符识别成类型保护,通过构造函数来细化类型,检测实例和类是否有关联,如下所示。

function work(man: Person | Programmer) {if (man instanceof Person) {//...} else if(man instanceof Programmer) {//...}
} 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值