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));
假设我有一个像这样的简单代码:
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));