TypeScript不需要所有索引属性
我有以下代码:TypeScript不需要所有索引属性,typescript,union-types,indexed-properties,Typescript,Union Types,Indexed Properties,我有以下代码: type AZ = 'a'|'b'|'c'|'d'| ... |'z'; // union of many types type Mapping = { [K in AZ]: string; } const obj: Mapping = { // error, missing properties 'c', 'd', etc. a: '', b: '' }; 这使我能够将obj的道具仅限于与联合体匹配的道具,但它迫使我将它们全部列出。如果我这样做: type M
type AZ = 'a'|'b'|'c'|'d'| ... |'z'; // union of many types
type Mapping = {
[K in AZ]: string;
}
const obj: Mapping = { // error, missing properties 'c', 'd', etc.
a: '',
b: ''
};
这使我能够将obj
的道具仅限于与联合体匹配的道具,但它迫使我将它们全部列出。如果我这样做:
type Mapping = {
[K in AZ]?: string;
}
现在我不必提供所有道具,但生成的道具类型包含未定义的
。我如何表示我只想从AZ提供一些密钥,但如果提供了,它们不应该是未定义的?换句话说,我想要:
const obj: Mapping = { // ok
a: '', // checks 'a' as string
b: '' // checks 'b' as string
bad: '' // error 'bad' not in AZ
// no additional props needed
};
。。。不必使用像obj[prop]这样的断言代码>
PS:这是否与?非常确定这是不可能的,也不确定您为什么要这样做。您必须检查它们是否在某个地方未定义。创建函数时会发生什么情况?函数不知道提供了哪些。是的,我基本上希望道具是可选的,但不是未定义的。当设置该值时,它与union prop/string val匹配,那么它实际上不可能是未定义的,因为在获取时,我也通过union prop进行匹配。Undefined在这里实际上没有帮助,因为它将可选的属性与其值的类型合并在一起代码>并像constobj:Mapping={a:'',b:''那样使用它代码>谢谢,不幸的是,联合是巨大的,我无法手动指定属性名称:((您可以编写一个泛型帮助程序隐式地构建该类型:函数映射(x:mapping):映射{return x;}
。然后const obj=mapping({a:'',b:'');