我有以下类和函数:
class Test {
prop: string;
otherProp: number;
constructor() {
const result = doSomething<Test>('prop');
}
}
function doSomething<T>(propName: keyof T): ???? {
// ,,,
}
使用打字稿有一种方法,我可以从函数中返回与该函数获得的属性相同的类型。在上面的示例中,返回类型应为string
。如果我用otherProp
进行调用,则返回类型应为数字。
答案 0 :(得分:3)
您需要一个额外的类型参数来捕获传入的密钥的实际类型(将其称为K
。然后,您可以使用K
来索引T
(即使用类型查询)
class Test {
prop: string;
otherProp: number;
constructor() {
const result = doSomething(this, 'prop');
}
}
function doSomething<T, K extends keyof T>(target: T, propName: keyof T): T[K] {
return this[propName];
}
我修改了上面的示例,以传入类型为T
的某些参数以从参数中推断出K
和T
。 Typescript不支持部分类型推断,因此我们无法指定T
并推断出K
。因此,如果我们没有类型为T
的参数,则需要编写:
class Test {
prop: string;
otherProp: number;
constructor() {
const result = doSomething<Test, 'prop'>('prop');
}
}
function doSomething<T, K extends keyof T>(propName: keyof T): T[K] {
return this[propName];
}
使用taht函数的更好版本s返回一个函数,并且在第一次调用中固定了T
,在第二次调用中确定了K
:
class Test {
prop: string;
otherProp: number;
constructor() {
const result = doSomething<Test>()('prop');
}
}
function doSomething<T>() {
return function <K extends keyof T>(propName: keyof T): T[K] {
return this[propName];
}
}