如何使 TypeScript 函数的返回类型成为不同的联合?

问题描述 投票:0回答:1

这是一个简单的例子来说明这种情况。我需要我的函数从它返回的值的类型推断出它的结果类型。为所有情况(太多了)添加显式结果类型注释并不是一种选择,这就是这个问题的本质 - 如何避免它。

考虑一个例子:

function f1() {
   return Math.random() > 0.5 ? { kind: 'a' } as const : { kind: 'b' } as const;
}
f1(); // { kind: 'a' } | { kind: 'b' }

到目前为止,它按预期工作,但是当我向其中一个案例添加一个额外的字段时,它会变成(由于缺乏更好的词)“非独特”

function f2() {
   return Math.random() > 0.5 ? { kind: 'a' } as const : { kind: 'b', x: Math.random() } as const;
}
f2(); // { kind: 'a', x?: undefined } | { kind: 'b', x: number }

我的期望:

  • 我希望
    f2
    的结果类型是
    f2(); // { kind: 'a' } | { kind: 'b', x: number }

我的问题:

  • f2
    中,如果通过
    x?: undefined
    { kind: 'a', x?: undefined }
    提供给
    as const
    ,我怎样才能避免
    { kind : 'a' }
    中的
    { kind: 'a' } as const

更新:

  • 我正在使用
    typescript@next
    版本,在撰写本文时为
    5.5.4
    :2024 年 9 月 27 日
typescript type-inference union-types
1个回答
0
投票

您可以使用实用函数:

function makeChoice<A, B>(condition: boolean, obj1: A, obj2: B): A | B {
  return condition ? obj1 : obj2;
}

function f2() {
   return makeChoice(Math.random() > 0.5 , { kind: 'a' }, { kind: 'b', x: Math.random() });
}

f2(); 

游乐场

© www.soinside.com 2019 - 2024. All rights reserved.