是否可以使用 return 类型的函数作为变量的类型?

Is it possible to use the return type of a function as the type of a variable?

假设我有这个功能:

let getData = () => {
    return {
        name: 'John',
        age: 2,
        isAsian: true
    }
}

我怎么说(如果可能的话)变量的类型是 getData 的 return 类型, 没有 影响它到 getData?

例如,我正在寻找类似的东西:

var data: getData

当然这是行不通的,因为类型是函数而不是函数的 return 值。 (编辑:实际上它只会给出错误:Cannot find name 'getData'

var data = getData() 可以; data 的类型将被推断为 {name: string, age: number, isAsian: boolean},但这不是我的解决方案。

这里有一个讨论可能与我的问题有关:

但是,这似乎不是我正在寻找的解决方案。首先,我还不能使用 Typescript 2.8(我正在使用 angular,但 CLI 不允许)。我认为替代方案,就像这个 SO 问题的主要解决方案一样,对我没有用,因为我希望动态使用我的函数的 return 类型。

从 TypeScript 2.9 开始(抱歉),您可以使用 ReturnType 类型:

let getData = () => {
    return {
        name: 'John',
        age: 2,
        isAsian: true
    }
}

let p: ReturnType<typeof getData>;
p.name; // string

在 2.9 之前,您可以使用一些解决方法,但它们不是很好。一种方式是:

let fake = (false as any) && getData();
let p: typeof fake;

。它仍然包含一个额外的函数和一个虚拟变量,但它没有在代码中调用 getData()

let getData = () => {
    return {
        name: 'John',
        age: 2,
        isAsian: true
    }
}


function getReturnType<R>(f: (...args: any[]) => R): { returnType: R } {
    return null!;
}

// dummy variable, used for retrieving getData return type only
let dataType = getReturnType(getData);

var data: typeof dataType.returnType; // var data: { name: string; age: number; isAsian: boolean; }