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:'');