【发布时间】:2018-04-22 18:33:19
【问题描述】:
我正在寻找一种方法来为以下具有两个已知键和一个具有已知类型的未知键的对象创建 TypeScript 类型:
interface ComboObject {
known: boolean
field: number
[U: string]: string
}
const comboObject: ComboObject = {
known: true
field: 123
unknownName: 'value'
}
该代码不起作用,因为 TypeScript 要求所有属性都与给定索引签名的类型匹配。但是,我不想使用索引签名,我想键入一个我知道其类型但我不知道其名称的字段。
到目前为止,我唯一的解决方案是使用索引签名并设置所有可能类型的联合类型:
interface ComboObject {
[U: string]: boolean | number | string
}
但这有很多缺点,包括允许在已知字段上使用不正确的类型以及允许任意数量的未知键。
有没有更好的方法? TypeScript 2.8 条件类型有帮助吗?
【问题讨论】:
-
TypeScript 不适合这种情况。我有一种方法可以强制编译器(使用条件类型)将函数参数限制为与您预期的
ComboObject类型匹配的类型(恰好是一个带有字符串属性且没有其他属性的额外键),但这太可怕了,而不是你的东西d 想在任何生产代码中使用。如果您有兴趣,我可以发布它,但我认为您可能想要寻求其他更适合 TypeScript 的选项。 -
@jcalz 是的,如果您可以发布或以其他方式发送它会很棒,即使它不完全可行,它也可能会激发一些想法。
-
这是一个非常特殊的情况,您需要 3 个属性,2 个已知属性和 1 个未知属性。 ????。我有一种情况,我有一个已知属性,然后是任意数量的未知属性(字符串 ????s)。我确实喜欢这个:
props: { children: string[] | VDOMElement[] } & { [key: string]: string };但是,在没有&运算符的情况下将它们放在一起 没有 工作:props: { children: string[] | VDOMElement[], [key: string]: string }; -
@CodeFinity 即使使用通常不起作用的
& {[key: string]: string}方法,因为已知属性不能与字符串联合:typescriptlang.org/play?#code/… -
好吧,我的实际代码中没有红线……但是。 ??? ??????而且,不,我不是通过降低
tsconfig来“作弊”。 :) 非常严格。
标签: typescript conditional-types