Typescript接口:任何描述“<interface> of <interface>”的方法

时间:2018-03-11 16:25:55

标签: typescript generics interface

快速举例:

public processList<T extends {}>(list: T[], targetProperty: ???) {
    // do something with target property...
}

我想要一个描述T接口的类型。因此,如果T的类型为{ a: string, b: boolean },那么我希望targetProperty接受ab

我知道我可以通过使用包含目标属性名称的字符串来解决此问题。含义如targetProperty = 'myProperty'然后item[targetProperty] = ...但我认为这可能在将来中断(例如当T的界面发生变化时)。

有没有办法实现这个目标?或者还有其他建议吗?

谢谢!

1 个答案:

答案 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