这是一个简单的例子来说明这种情况。我需要我的函数从它返回的值的类型推断出它的结果类型。为所有情况(太多了)添加显式结果类型注释并不是一种选择,这就是这个问题的本质 - 如何避免它。
考虑一个例子:
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 日您可以使用实用函数:
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();