【发布时间】:2019-08-31 17:57:25
【问题描述】:
使用字符串访问接口/类属性的正确方法是什么?
我有以下界面
interface Type {
nestedProperty: {
a: number
b: number
}
}
我想像这样使用数组迭代来设置嵌套属性:
let myType:Type = ...
["a", "b"].forEach(attributeName => myType.nestedProperty[attributeName] = 123)
TS 抱怨“nestedProperty”没有字符串索引类型。如果我添加 if typeguard(例如if (attributeName === "a")) 编译器很高兴,但我真的不想去if (...===... || ...===... || ... ) { 路由。
我也不想使用索引类型:
interface Type<T> {
[index:string]: <T>
a: <T>
b: <T>
}
由于它不是动态结构,因此属性可能有不同的类型。
我确信有一些优雅的方法可以做到这一点,但似乎无法在文档/堆栈溢出/web 中的任何地方找到它。
我应该为此编写自定义保护返回联合类型谓词吗? 类似的东西?
(attribute: string): attribute is ('a' | 'b') { ... }
【问题讨论】:
-
我不确定您的
Type接口是否只是一个通用示例。如果不是,您可以使用interface Type {nestedProperty: {[key: string]: number};} -
是的。那是“解决方案”之一,但我不希望
Type成为动态结构,我可以在那里放置任何东西。我想坚持一组定义的属性。我已将问题编辑得更准确 -
那么
interface Type {nestedProperty: {[key in ('a' | 'b')]: number};}呢?
标签: typescript