在无法访问代码路径时抑制 "not all paths return a value" Typescript 警告
Suppressing the "not all paths return a value" Typescript warning when a code path is unreachable
我有一个函数 foobar(x:string) 如果 x 是空字符串,它不会 return。否则,它 return 另一个字符串。
所以我不能声明为return"never",如果我声明为return"string",TS没有意识到后面的代码可能达不到
(是的,这是一个糟糕的设计。不,我不能改变它)
有时,我需要在另一个函数中将它与空 x 一起使用,而在其他分支中 returns 是一个值。所以像
function f(n:number)
{
if (n==0) {
foobar("")
}
else
{
return n - 1
}
}
TS 抱怨因为不是所有路径 return 一个值。所以我想告诉编译器 foobar 不会 return (或者,等价于它之后的代码是不可访问的)。编造一些东西,比如:
function f(n:number)
{
if (n==0) {
foobar("")
/** @notreachable */
}
else
{
return n - 1
}
}
我可以这样做吗?我还可以做些什么?我可以 return 类型的东西 never,也许,但是我怎么才能得到 never "value" 到 return?
你试过函数重载吗:
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;
}
}
我有一个函数 foobar(x:string) 如果 x 是空字符串,它不会 return。否则,它 return 另一个字符串。
所以我不能声明为return"never",如果我声明为return"string",TS没有意识到后面的代码可能达不到
(是的,这是一个糟糕的设计。不,我不能改变它)
有时,我需要在另一个函数中将它与空 x 一起使用,而在其他分支中 returns 是一个值。所以像
function f(n:number)
{
if (n==0) {
foobar("")
}
else
{
return n - 1
}
}
TS 抱怨因为不是所有路径 return 一个值。所以我想告诉编译器 foobar 不会 return (或者,等价于它之后的代码是不可访问的)。编造一些东西,比如:
function f(n:number)
{
if (n==0) {
foobar("")
/** @notreachable */
}
else
{
return n - 1
}
}
我可以这样做吗?我还可以做些什么?我可以 return 类型的东西 never,也许,但是我怎么才能得到 never "value" 到 return?
你试过函数重载吗:
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;
}
}