值作为接口中的类型

时间:2018-05-08 13:55:39

标签: typescript

为什么在打字稿中允许这样做?

interface a {
  age: 42
}

42不是一种类型。我认为接口应该永远不会有实现细节,而是“真实”类型,如age: number。我认为这是枚举age: AgeEnum的捷径,但不是一个非常漂亮的捷径。

如果我这样做,它会混淆编译器(将42与数字混淆)。如果我这样做:

class Person implements a { 
  public age: number = 42
}

error: Type number is not assignable to type 42

...我觉得有点混乱!

我也没有在文档中找到这样的例子。反正不是直接的例子。

有人可以向我解释为什么在打字稿中允许这样做吗?

2 个答案:

答案 0 :(得分:2)

界面a声明age仅限于值42。在您的实现中,您要将字段a的类型约束重新定义为number,因此会出错。

在typescript中允许它,因为您可以约束到原始文字值。这实际上是一件非常好的事情。如果您想将年龄更改为ageInDecades并假设人们不会活过100岁,那会怎么样?然后,您可以在age上定义接口约束,如下所示:

interface IAge {
  ageInDecades: 0|10|20|30|40|50|60|70|80|90|100;
}

这是一个相当薄弱的例子,但我认为你明白了。您可以使用允许的字符串值执行相同的操作。

答案 1 :(得分:0)

TypeScript允许字符串和数字的文字类型。在您的情况下,42实际上是一种类型:数字42.这与类型number不同。

请注意,当您为实现接口的类属性分配数字和字符串时,TypeScript会假定这些是基本类型而不是文字类型。这可能是错误或TypeScript的限制。您可以通过在分配期间指定类型来解决此问题。

interface a {
  age: 42;
  name: 'Andrew';
}

class Person implements a {
  age: 42 = 42;
  name: 'Andrew' = 'Andrew';
}

使用42 | 43 | 44等联合类型时,这更有用。