基于类属性的Typescript函数返回类型

时间:2019-01-25 12:23:23

标签: typescript

我有以下类和函数:

class Test {
  prop: string;
  otherProp: number;

  constructor() {
    const result = doSomething<Test>('prop');
  }
}

function doSomething<T>(propName: keyof T): ???? {
  // ,,,
}

使用打字稿有一种方法,我可以从函数中返回与该函数获得的属性相同的类型。在上面的示例中,返回类型应为string。如果我用otherProp进行调用,则返回类型应为数字。

1 个答案:

答案 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的某些参数以从参数中推断出KT。 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];
    }
}