Typescript学习日记—3

1.外部枚举

外部枚举用来描述已经存在的枚举类型的形状。

declare enum Enum {
    A = 1,
    B,
    C = 2
}

外部枚举和非外部枚举之间有一个重要的区别,在正常的枚举里,没有初始化方法的成员被当成常数成员。 对于非常数的外部枚举而言,没有初始化方法时被当做需要经过计算的。

declare在Typescript的意义在于这个枚举类型可能在别的地方存在,类似于C语言的声明。declare enum实际不会生成一个对象。当然如果它们的属性是计算的,那么是内联的。可以参考这篇https://stackoverflow.com/questions/28818849/how-do-the-different-enum-variants-work-in-typescript

2.上下文类型

TypeScript类型推论也可能按照相反的方向进行。 这被叫做“按上下文归类”。按上下文归类会发生在表达式的类型与所处的位置相关时。

window.onmousedown = function(mouseEvent) {
    console.log(mouseEvent.button);  //<- Error
};

这句话就很好理解了。上下文可以理解为一篇文章的上下文内容,同样的一句话,不同文章的上下文表达的意思也是不同的。上下文归类就是根据所处的位置来判断表达式的类型。比如例子中使用了Window.onmousedown函数的类型,来推断出mouseEvent的类型。

3.上下文类型

上下文归类会在很多情况下使用到。 通常包含函数的参数,赋值表达式的右边,类型断言,对象成员和数组字面量和返回值语句。 上下文类型也会做为最佳通用类型的候选类型。比如:

function createZoo(): Animal[] {
    return [new Rhino(), new Elephant(), new Snake()];
}

这个例子里,最佳通用类型有4个候选者:AnimalRhinoElephantSnake。 当然, Animal会被做为最佳通用类型。

这句话的表示了上下文归类会在哪里使用到。例子中return表达式的上下文类型就是Animal[ ],根据文档所说的上下文类型会成为最佳通用类型候选类型,所以有4个候选者,当然Animal是最佳通用类型,毕竟其余三个类型都是Animal的派生类

4.函数参数双向协变

当比较函数参数类型时,只有当源函数参数能够赋值给目标函数或者反过来时才能赋值成功。 这是不稳定的,因为调用者可能传入了一个具有更精确类型信息的函数,但是调用这个传入的函数的时候却使用了不是那么精确的类型信息。 实际上,这极少会发生错误,并且能够实现很多JavaScript里的常见模式。

这句话想表达一个精确的类型信息赋值给一个不精确的类型时就会发生协变。协变在c#和java等oop语言中有描述,大概的作用就是父类和子类保持相同的变化。不稳定的原因就是虽然比较函数类型只有当源函数参数赋值给目标函数或者反过来才能赋值成功,但是由于有了协变,有可能不是我们需要的参数,当然实际上很少会发生错误,而且能实现很多常见的模式。

5.子类型和兼容

目前为止,我们使用了兼容性,它在语言规范里没有定义。 在TypeScript里,有两种类型的兼容性:子类型与赋值。 它们的不同点在于,赋值扩展了子类型兼容,允许给 any赋值或从any取值和允许数字赋值给枚举类型或枚举类型赋值给数字。语言里的不同地方分别使用了它们之中的机制。 实际上,类型兼容性是由赋值兼容性来控制的,即使在implementsextends语句也不例外。 更多信息,请参阅 TypeScript语言规范.

赋值包括了子类型兼容,还允许了比如枚举类型赋值给数字,反之亦然。所以类型兼容性由赋值兼容性来控制很容易理解。具体的语言规范可以参考https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值