本节介绍ts中的高级类型及Symbols相关内容,高级类型包括交叉类型、联合类型、类型保护、类型别名等内容,Symbols是ECMAScript 2015后的原生类型,像其他的基础类型number和string一样,通过Symbol构造函数创建,Symbol是不可改变且唯一的。
-
讲解视频
TS学习笔记九:高级类型
-
B站视频
TS学习笔记九:高级类型
-
西瓜视频
https://www.ixigua.com/7322652210817729062
一、高级类型
ts中除了基础类型、类类型、枚举、泛型等外还有一些特有的高级类型,包括交叉类型、联合类型等。
1.交叉类型
交叉类型是将多个类型进行联合,联合后新成一个新的类型,新的类型包含被联合的多个类型的所有特性,如:A&B&C同时具有A和B和C的特性,并且都能兼容。
在mixins中交叉类型比较常见,mixins在后续章节中会介绍,示例如下:
function extend<T, U>(first: T, second: U): T & U {
let result = <T & U>{
};
for (let id in first) {
(<any>result)[id] = (<any>first)[id];
}
for (let id in second) {
if (!result.hasOwnProperty(id)) {
(<any>result)[id] = (<any>second)[id];
}
}
return result;
}
class A{
constructor(public name: string) {
}
}
interface B{
log(): void;
}
class C implements B{
log() {
// ...
}
}
var jim = extend(new A("Jim"), new C());
var n = jim.name;
jim.log();
上述示例中对A和C进行了mixins处理,即将A类型中的所有成员及C类型中的所有成员进行合并,合并到新的成员中,最后的结果变量jim包含了A和B及C三个类型的所有成员,合并是通过对类原型进行复制操作来实现,最终的结果是传入的T和U的联合类型。
2.联合类型
联合类型是标识几种类型之一,使用|分隔每个类型,如:number|string|boolean表示既可以是number,也可以是string,也可是boolean。如果一个值是联合类型,只能访问联合类型的所有类型里的共有成员,如下:
interface A{
a();
b();
}
interface B{
b();
c();
}
function C():A|B{
}
let c = C();
c.b()//可以调用
c.a()//报错,因为a不是共同具有的成员。
也可以使用any传递参数,any传递时可以传递任何类型的参数,但是如果传入的参数将没有限制,在函数处理时就有可能出现问题。所以最好使用联合类型,使用了联合类型之后,将限定参数的类型范围,只能是指定的几种类中的一种,这样参数的类型就是可预测的,而不像any一样参数的类型不可预测,会导致后续代码处理时出现不确定性。
3.类型保护和区分类型
使用联合类型时,由于类型有可能是联合类型的任何一种,当想明确的知道具体的类型的到底是那种的时候,需要进行特出判断或者类型断言,如下:
interface A{
a();
b();
}
interface B{
b();
c();
}
function C():A|B{
}
let c = C();
if(c.a){
c.a();
}else if(c.c){
c.c();
}
上述实例js中没有问题,但是ts中会报错,因为c的类型不确定,即使使用了if判断,类型也不确定,此时可以使用类型断言进行类型判断:
interface A{
a();
b();
}
interface B{
b();
c();
}
function C():A|B{
}
let c = C();
if((