Скажем, у меня есть простой код:
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.info(myFunc(t)); // will log "Chris"
Я получаю доступ к свойству из базового класса через строку «свойство» из MyInterface. Это работает только потому, что я разрешаю ему быть только "имя".
Я хочу указать свойство-свойство, чтобы разрешать только строки, которые представляют свойства универсального объекта 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.info(myFunc(t));