Typescript 返回类型';绝不';如果将可选参数指定为特定值

Typescript 返回类型';绝不';如果将可选参数指定为特定值,typescript,function,overloading,typing,Typescript,Function,Overloading,Typing,我有一个函数,它接受一个可选的boolean参数,该参数默认为false。当参数为false时,函数返回一个字符串。当参数为true时,函数应返回typenever 以下是我尝试过的: function example(arg: true): never; function example(arg = false): string { //... } 这让人感觉它应该可以工作:arg被推断为具有boolean类型,当它未被传递或作为false传递时,示例返回字符串。当它作为true传递时,

我有一个函数,它接受一个可选的
boolean
参数,该参数默认为
false
。当参数为
false
时,函数返回一个
字符串。当参数为
true
时,函数应返回type
never

以下是我尝试过的:

function example(arg: true): never;
function example(arg = false): string {
  //...
}
这让人感觉它应该可以工作:
arg
被推断为具有
boolean
类型,当它未被传递或作为
false
传递时,
示例
返回
字符串
。当它作为
true
传递时,重载开始生效,
example
返回
never

然而,这根本不起作用。TypeScript提供
arg
类型
true
,并使其成为必需的,并使
示例始终返回
从不

我也试过这种疯狂的方式,并且更接近:

function example(arg: false): string;
function example(arg: true): never;
function example(arg: boolean): string | never;
function example(arg = false): string | never {
  //...
}
<>但是编译器仍然没有考虑<代码> ARG是可选的。

< P>这似乎起作用:

function example(arg: true): never;
function example(arg?: false): string;
function example(arg: boolean): string;
function example(arg: boolean = false): never | string {
    if (!arg) {
        return 'foo';
    }

    throw new Error();
}

const foo = example(true); // typeof foo is never
const bar = example(false); // typeof bar is string
const baz = example(); // typeof baz is string

谢谢!我能够使用您的代码使其正常工作,但添加了一个额外的重载
示例(arg:boolean):对于传递的变量类型为
boolean
的情况,永远不要使用| string
,而不是
true
false
@Ian,啊,我错过了那部分!更新了答案。