TS学习笔记六:高级类型/Symbols

  本节介绍ts中的高级类型及Symbols相关内容,高级类型包括交叉类型、联合类型、类型保护、类型别名等内容,Symbols是ECMAScript 2015后的原生类型,像其他的基础类型number和string一样,通过Symbol构造函数创建,Symbol是不可改变且唯一的。

  1. 讲解视频

    TS学习笔记九:高级类型

  2. B站视频

    TS学习笔记九:高级类型

  3. 西瓜视频
    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((
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

军军君01

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

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

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

打赏作者

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

抵扣说明:

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

余额充值