此问题在此处已有答案:
How to define Typescript type as a dictionary of strings but with one numeric "id" property(3个答案)
昨天关门了。
我有一个相当简单的接口Item
,它被分配给对象。
此接口指定这些对象中的每一个 * 必须 * 具有一个itemName
属性集,但如果需要,它们也可以具有带有动态名称的 * 附加 * 属性。
我尝试使用以下代码来实现此功能
interface ItemProperty {
foo: string;
bar: string;
}
interface Item {
itemName: string;
[propertyName: string]: ItemProperty;
}
现在,显然这会抛出以下错误:
类型为“string”的属性“itemName”不能分配给“string”索引类型“ItemProperty”。
由于itemName
在技术上是ItemProperty
的一部分,但它是string
而不是ItemProperty
。
如何重写这个值,以便可以设置itemName
,而 * 无需 * 满足ItemProperty
?
最终的Item
对象可能如下所示:
const item: Item = {
itemName: "Item 1",
dynamicProperty1: {
foo: "foo",
bar: "bar"
}
};
2条答案
按热度按时间cvxl0en21#
相反,您可以使用如下类型联合来解决此问题:
在这里,您可以接受字符串类型或对象
打字机Playground
f1tvaqid2#
对于以下接口:
TS将尝试查找属性的定义。如果找到,它将强制执行该定义。如果没有,它将使用动态定义。
一个简单的解决方案是更新
itemName
的类型定义以接受多个类型