为什么在打字稿中允许这样做?
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
...我觉得有点混乱!
我也没有在文档中找到这样的例子。反正不是直接的例子。
有人可以向我解释为什么在打字稿中允许这样做吗?
答案 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
等联合类型时,这更有用。