typescript - 如何解压作为 Typescript 联合且可能是数组的返回类型?

标签 typescript typescript-typings

我有一个返回类型如下所示的函数:

type FuncReturns = TypeA | [any, TypeB];

哪里...

interface TypeA {
    name: string;
    count: number;
}

interface TypeB {
    color: string;
    volume: number;
    edges: number;
}

const myAwesomeFunc = (val : string | number, obj : object = {}) : FuncReturns=>{
    switch(typeof val){
       case "string" : {
           return {
               name: val,
               count: 1
           }
       } case "number" : {
           return [obj, {
               color: "blue",
               volume: 6,
               edges: 6
           }]
       } default {// should never be used in this way
            throw new Error("This is nonsense.")
       }
    }
} 

...应该可以像这样解压(可破坏)...

const {name, count} = myAwesomeFunc(someValue);

...像这样...

const [object, {color, volume, edges}] = myAwesomeFunc(someOtherValue);

基于一些内部逻辑,该函数可能会返回一个对象 TypeA(我想解包)或一个数组 TypeB(我也想解包)。不幸的是,我没有接受数组解包运算符作为可应用于返回类型的可能方法之一,而是最终得到一个错误,指出联合类型不是数组类型。我可以为我的用例想到几种解决方法,但我想知道是否有解决此问题的既定方法。

注意: 正如 alekxsor 适当指出的那样,我希望函数向下移动实际上只有两个分支:(1)返回对象的字符串 val 和(2)返回数组的数字 val。最佳解决方案将启用类型检查,以便在提供字符串时,预期的返回类型将是对象等。

最佳答案

type FuncReturns = TypeA | [any, TypeB]

const myAwesomeFunc = (val : string | number, obj : object = {}): FuncReturns {...}

这个签名有效地告诉我们,在具体类型中它可以执行以下任何操作:

  (val: string, obj: ...) => TypeA
  (val: string, obj: ...) => [any, TypeB]
  (val: number, obj: ...) => TypeA
  (val: number, obj: ...) => [any, TypeB]

这肯定不是它在实践中所做的事情。传达确切含义的最简洁的方法是使用 function overloading :

function myAwesomeFunc(val: string): TypeA
function myAwesomeFunc(val: number, obj: object): [any, TypeB]
function myAwesomeFunc(val: string | number, obj?: object): TypeA | [any, TypeB] {
  // actual implementation
}

更新const版本:

要使其使用 const 语法,您可以将其定义为可调用接口(interface)或函数类型的交集:

interface MyAwesomeFunc {
  (val: string): TypeA
  (val: number, obj: object): [any, TypeB]
}

or

type MyAwesomeFunc 
  = (((val: string) => TypeA) 
  & ((val: number, obj: object) => [any, TypeB]))

const myAwesomeFunc: MyAwesomeFunc = (val: string | number, obj?: object): any {
 // ...
}

TS playground

关于typescript - 如何解压作为 Typescript 联合且可能是数组的返回类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67681115/

相关文章:

typescript - Typescript 中的多种类型谓词

javascript - 为什么我没有实体的引用 ID?

javascript - 如何获取所需格式的日期 : ionic 4

node.js - 打字安装不适用于已配置的 typescript 定义

Typescript 定义、ES6 类和构造函数

javascript - typescript 中映射的定义列表中的动态键名称

typescript - 类方法的条件返回类型取决于构造函数中的选项

javascript - 如何将第三方库 (gridstack.js) 与 Typescript 和 React 结合使用

json - 仅使用 angular 7 将 json 数据写入本地 JSON 文件

reactjs - 如何在 Material ui Popper 中输入过渡 Prop