如果我有课的话
class Foo {
type: "foo"
constructor(public id: number) {}
}
class Bar {
type: "bar"
constructor(public id: number) {}
}
type SomeUnion = Foo | Bar // (x : SomeUnion).type will have the type "foo" | "bar"
构造一个实例new Foo(1)
将产生{ id: 1 }
在运行时,但我想得到{ id: 1, type: "foo" }
.
一个简单的解决方案当然是输入字符串常量两次,通过在构造函数中分配它,例如this.type = "class_name"
.
然而,这是不理想的,因为我需要输入相同的字符串常量两次。这不是什么大事,但这是一种人们可能会忘记并导致错误的事情。
有没有办法自动创建与字符串文字具有相同值的对象成员?
让我们重点关注这段代码:
class Foo {
type: "foo"
constructor(public id: number) {}
}
如果编译器选项strictNullChecks
is false
, then type: "foo"
隐式还允许设置type
到价值观undefined
and null
。我希望需要将该字段显式初始化为除undefined
是显而易见的。
那么让我们继续strictNullChecks
set to true
。在这种情况下,唯一可以分配给type
is "foo"
。看起来您希望有某种方法让编译器执行以下推理:
type: "foo"
说字段名为type
必须是类型"foo"
。因此,只有值"foo"
可以分配给它。因此,我应该发出代码来自动将其初始化为"foo"
因为没有其他值可以分配给它。
问题是 TypeScript 2.x 即使strictNullChecks
目前允许字段以值开头undefined
即使分配undefined
无效。让我明确地说:即使你不能assign价值undefined
to type
, 场type
can start与价值undefined
(如果你没有初始化它)。这不被视为错误。这就是 TypeScript 目前的设计方式。有一个就此问题发布报告 https://github.com/Microsoft/TypeScript/issues/8476,有些人认为这是语言的设计缺陷。
无论如何,编译器不会执行上述所需的推理。现在,无论哪种方式,您都必须重复相同的值作为字符串文字类型的一部分以及作为初始化的一部分。type
fields.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)