Select 属性 通过接口从打字稿中的对象命名

Select property name from object in typescript via interface

假设我有一个像这样的简单代码:

interface MyBase {
    name: string;
}
  
interface MyInterface<T extends MyBase> {
    base: MyBase;
    age: number;
    property: "name"   // should be: "string" but only properties from T
}    
  
const myFunc = <T extends MyBase>(item: MyInterface<T>) => {
    return item.base[item.property];
}
  
let t:MyInterface<MyBase> = {base: {name: "Chris"}, age: 30, property: "name"};
console.log(myFunc(t));  // will log "Chris"

我正在通过 MyInterface 中的字符串“属性”从基 class 访问 属性。这只有效,因为我只允许它完全是“名称”。

我想指定 属性-属性 只允许代表通用对象 T 上的属性的字符串。如果我只是将它更改为“字符串”,Typescript 当然会在 myFunc 中抱怨而且我不想明确地转换为任何东西。

这可能吗?

提前致以问候和感谢, 克里斯托夫

您可以使用 keyof。我在下面稍微修改了您的代码:

interface MyBase {
  name: string;
}

interface MyInterface<T extends MyBase> {
  base: T;
  age: number;
  property: keyof T; // should be: "string" but only properties from T
}

const myFunc = <T extends MyBase>(item: MyInterface<T>) => {
  return item.base[item.property];
};

let t: MyInterface<MyBase> = {
  base: { name: "Chris" },
  age: 30,
  property: "name",
};
console.log(myFunc(t));