是否可以将函数的返回类型用作变量的类型?

时间:2018-06-28 21:50:01

标签: typescript typescript2.0

假设我具有此功能:

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

我怎么说(即使可能)变量的类型是getData的返回类型,没有而不会影响到getData

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

var data: getData

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

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

这里有一个讨论可能与我的问题有关:Obtaining the return type of a function

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

2 个答案:

答案 0 :(得分:3)

从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;

答案 1 :(得分:3)

Here is another solution for pre-2.8 compiler。它仍然包含一个额外的功能和一个虚拟变量,但是在代码中没有调用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; }