我有一个函数foobar(x:string),如果x是空字符串,它将不会返回。否则,它将返回另一个字符串。
所以我不能声明它返回 "never",如果我声明它返回 "string",TS就不会意识到后面的代码可能达不到了
(是的,这是一个可怕的设计,不,我不能改变它)
有时,我需要在另一个函数中使用空x,而这个函数在其他分支中会返回一个值。因此,类似于
function f(n:number)
{
if (n==0) {
foobar("")
}
else
{
return n - 1
}
}
TS抱怨是因为不是所有的路径都会返回一个值。所以我想告诉编译器,foobar不返回(或者说,等价于它之后的代码是无法到达的)。编个东西,类似于。
function f(n:number)
{
if (n==0) {
foobar("")
/** @notreachable */
}
else
{
return n - 1
}
}
我可以这样做吗?我还能做什么?我可以返回一些类型为never的东西,也许可以,但我如何让一个never的 "值 "返回?
你有没有试过函数重载。
function foobar(val: string): string;
function foobar(val: ''): never;
function foobar(val: string): string {
if (val === '') {
// while (true) {
// console.log('Infinite loop also works fine');
// }
throw new Error('never returns');
} else {
return 'new value';
}
}
function f(n: number) {
if (n === 0) {
foobar('');
} else {
return n - 1;
}
}
更新我想类似的方法也能适用于空对象。
interface NoProps {
[a: string]: never;
}
interface X {
a?: string;
}
function foobar(val: NoProps): never;
function foobar(val: X): string;
function foobar(val: NoProps | X): string {
if (val.a === undefined) {
throw new Error('never returns');
} else {
return 'new value';
}
}
function f(n: number) {
if (n === 0) {
foobar({});
} else {
return n - 1;
}
}