【问题标题】:How to type a function so that its return type matches that of an array that is being returned?如何键入函数以使其返回类型与返回的数组匹配?
【发布时间】:2019-12-21 11:14:22
【问题描述】:

这很难在标题中描述属性,所以这里是一个例子:我有一个函数应该返回一个包含两个项目的数组:

const calc = () => Math.random();

const myFunc = () => ([calc(), 'string']);

这样数组中的第一项总是calc函数的返回类型,第二项总是一个字符串。

当我运行这个时,myFunc 推断的类型变为(number | string)[]

相反,我希望类型为[number, string],这样我就可以像这样解构:

const [calcResult, str] = myFunc();

...这两项都会正确输入。

通常,我会明确地给 myFunc 一个返回类型:

const myFunc = (): [number, string] => ([calc(), 'string']);

然后我得到我想要的:

棘手的部分是我不能只将硬编码的返回类型添加到myFunc,因为在我的真实代码中calc() 返回的类型非常复杂(当我使用IDE 的推理显示功能)并且可以随时间轻松更改。所以我想让它继续被推断,同时保持返回类型的固定结构与我返回的确切数组匹配,这样我就可以对它使用解构。

我怎样才能做到这一点?

谢谢!

【问题讨论】:

    标签: typescript types typescript-generics union-types


    【解决方案1】:

    好的,找到答案了...我需要 typeof 关键字来引用推断的类型。所以,我可以这样做:

    const calc = () => Math.random();
    
    const myFunc = () => {
        const result = calc();
    
        return [result, 'string'] as [typeof result, string];
    };
    

    产生正确的类型:

    【讨论】:

      【解决方案2】:

      我不明白你到底想要什么,但如果我执行你的代码,我会得到这个

      const calc = () => Math.random();
      const myFunc = () => ([calc(), 'string']);
      myFunc()
      
      -> RESULT [0.2612262266408696, "string"]
      

      这是你所期望的?

      【讨论】:

      • 结果是正确的,但是结果的类型不...可以在任何位置包含字符串或数字的数组。相反,我想要一个数组,它只能在第一个位置有一个数字,在第二个位置有一个字符串(这样我就可以正确解构这些项目)。类型应为[string, number]。我可以通过对类型进行硬编码来做到这一点,但由于calc() 的返回类型非常复杂,我想保持推断。我会在问题中添加更多细节。
      • 我在问题中添加了更多细节。结果无论哪种方式都有效......这是一个打字问题。感谢您的调查!
      猜你喜欢
      • 2021-05-28
      • 2020-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-19
      • 2023-03-06
      相关资源
      最近更新 更多