【问题标题】:Extract type information from return result of a function从函数的返回结果中提取类型信息
【发布时间】:2020-03-02 08:24:04
【问题描述】:

我有以下功能(playground):

function myf(): Record<string, string> {
    return {
      prop1: "a",
      prop2: "b"
    }
}

函数是纯函数,只返回字典值。我需要从函数的返回类型中提取的类型定义,即{prop1: string, prop2: string}。 当我使用

type MyType = ReturnType<typeof myf>;

它给了我通用的{[key: string]: string} 类型,这是正确的,但不是我想要实现的:

当我使用没有返回类型的函数时,如下所示 (playground):

function myf() {
    return {
       prop1: "a",
       prop2: "b"
    }
}

然后它会产生有效的结果:

但是,在这种情况下,我的返回值没有类型检查。

是否可以在返回值中进行类型检查并以某种方式在该函数之外推断返回类型? IE。我想要类似下面的东西(但 myvar 有智能感知)

【问题讨论】:

  • 我不太明白第二种情况的问题是什么。将{prop1: string; prop2: string} 作为返回类型可以解决问题吗?
  • 当然会解决问题,但我不想引入单独的返回类型,因为我有一种感觉,我可以使用 TypeScript 类型系统以某种方式推断该类型。可能我可能有很多类似的函数,都返回不同的对象,返回对象在开发期间会发生变化,因此我不想每次在返回对象上添加\删除\更改属性时都修复返回类型定义。相反,我希望自动推断返回类型。
  • IMO,如果您不想引入单独的返回类型,请不要编写返回类型,让 typescript 推断它
  • 然后我失去了返回值的类型检查,正如我在问题中描述的那样:)。
  • 但是你想在你的函数中检查什么?

标签: typescript


【解决方案1】:

只要将返回注释 : Record&lt;string, string&gt; 添加到函数 function myf(): Record&lt;string, string&gt; {,任何类型推断都会始终为您提供 Record&lt;string, string&gt;

推荐

你已经知道了,要获取实际返回的类型,你可以让 TypeScript 推断它:

function myf() {
    return {
        prop1: "a",
        prop2: "b"
    }
}

// Now its {prop1: string, prop2: string}
type MyType = ReturnType<typeof myf>;

【讨论】:

  • 谢谢,这是我最初的尝试之一,但如问题所示,使用建议的方法,我在函数内部丢失了类型检查,即我无法检查 @987654325 的值@ 是一个字符串,因为它只接受任何东西。同样对于 Record&lt;string, IMyData&gt; 这样的类型,出于同样的原因,我在返回类型中失去了智能感知。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-10
  • 1970-01-01
  • 2012-12-19
  • 1970-01-01
  • 2013-01-05
  • 1970-01-01
相关资源
最近更新 更多