代码之家  ›  专栏  ›  技术社区  ›  Maxime Dupré

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

  •  0
  • Maxime Dupré  · 技术社区  · 7 年前

    假设我有这个功能:

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

    我怎么说(如果可能的话)变量的类型是 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不允许我使用)。我认为这个备选方案,就像这个问题的主要解决方案一样,对我来说没有什么用处,因为我希望动态地使用函数的返回类型。

    2 回复  |  直到 7 年前
        1
  •  3
  •   Ryan Cavanaugh    7 年前

    从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;
    
        2
  •  3
  •   artem    7 年前

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