快速举例:
public processList<T extends {}>(list: T[], targetProperty: ???) {
// do something with target property...
}
我想要一个描述T
接口的类型。因此,如果T
的类型为{ a: string, b: boolean }
,那么我希望targetProperty
接受a
或b
。
我知道我可以通过使用包含目标属性名称的字符串来解决此问题。含义如targetProperty = 'myProperty'
然后item[targetProperty] = ...
但我认为这可能在将来中断(例如当T的界面发生变化时)。
有没有办法实现这个目标?或者还有其他建议吗?
谢谢!
答案 0 :(得分:0)
不幸的是,没有办法将变量类型声明为SomeInterface.Property,因为Typescript既没有自身的优点,也没有基于Javascript运行时不是反射语言。无法以这种简单的方式建立运行时检查。
从静态检查开始,存在索引类型查询keyof
。
interface Person {
name: string;
age: number;
location: string;
}
type K1 = keyof Person; // "name" | "age" | "location"
type K2 = keyof Person[]; // "length" | "push" | "pop" | "concat" | ...
此查询生成的结果是一个类型本身,因此您将其他通用约束声明为
function getProperty<T, K extends keyof T>(obj: T, key: K) {
return obj[key]; // Inferred type is T[K]
}
来源:https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-1.html