gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 18:44:08 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com