我正在尝试创建一种类型,其中函数的返回值取决于另一个属性的值,这可能吗?
据我所知,在定义接口时无法引用正在定义的接口。
另一种解决方法是将keyof T
保存为某种类型(例如K in keyof T
或类似的类型),以便稍后在类中重用,但这似乎不起作用
这基本上是我想要做的(尽管this
显然不起作用):
interface GenericType<T> {
column: keyof T;
genericFunction: () => T[this.column];
}
假设T有两个键:
a: number,
b: string
然后我希望将通用类型键入为
column: 'a',
genericFunction: () => number
如果列更改为'b'
,则genericFunction
应该返回string
。
答案 0 :(得分:1)
您可以执行以下操作:
interface GenericType<T, U extends keyof T> {
column: U;
genericFunction: () => T[U];
}
如何使用它:
interface AB {
a: number
b: string
}
const a: GenericType<AB, "a"> = {
column: "a",
genericFunction() {
return 12; // the compiler ensures the return value is a number
}
};
或者,通过推理使用它的另一种方式:
function makeGenType<T, U extends keyof T>(obj: T, propName: U): GenericType<T, U> {
return {
column: propName,
genericFunction() {
return obj[propName];
}
};
}
const genType = makeGenType({ a: 12, b: "ab" }, "b");
// Type of `genType` is: { column: "b", genericFunction: () => string }