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

Typescript 定义泛型类型时引用自己的属性,typescript,Typescript,我试图创建一个类型,其中函数的返回值取决于另一个属性的值,这可能吗 据我所知,不可能在定义接口时引用它 另一种方法是将keyof T保存为某种类型(如K in keyof T或类似类型),以便以后在类中重用,但这似乎不起作用 这基本上就是我想要做的(尽管这显然不起作用): 然后我希望我的泛型类型被键入为 column: 'a', genericFunction: () => number 如果列更改为'b',则通用函数应返回字符串您可以执行以下操作: interface GenericT

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

据我所知,不可能在定义接口时引用它

另一种方法是将
keyof T
保存为某种类型(如
K in keyof T
或类似类型),以便以后在类中重用,但这似乎不起作用

这基本上就是我想要做的(尽管
这显然不起作用):

然后我希望我的泛型类型被键入为

column: 'a',
genericFunction: () => number

如果列更改为
'b'
,则
通用函数
应返回
字符串

您可以执行以下操作:

interface GenericType<T, U extends keyof T> {
  column: U;
  genericFunction: () => T[U];
}
接口通用类型{
栏目:U;
通用函数:()=>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
  }
};
接口AB{
a:号码
b:字符串
}
常量a:GenericType={
专栏:“a”,
genericFunction(){
return 12;//编译器确保返回值是一个数字
}
};
或者,用另一种方式进行推理:

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 }
函数makeGenType(obj:T,propName:U):GenericType{
返回{
列:propName,
genericFunction(){
返回obj[propName];
}
};
}
const genType=makeGenType({a:12,b:ab},b”);
//`genType`的类型是:{column:“b”,genericFunction:()=>string}

谢谢,但这还不到一半。如果使用上面的示例,将返回值键入
number | string
。我只想要实际使用的钥匙类型。看来我想做的事情很棘手,我开始明白为什么它不起作用了。@Boivie,我编辑过。如果指定成员名称,则返回类型不是并集。
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 }