定义泛型类型时引用自己的属性

时间:2019-07-12 08:55:20

标签: typescript

我正在尝试创建一种类型,其中函数的返回值取决于另一个属性的值,这可能吗?

据我所知,在定义接口时无法引用正在定义的接口。

另一种解决方法是将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

1 个答案:

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