typescript - 当代码路径无法访问时,抑制“并非所有路径都返回值”Typescript 警告
问题描述
我有一个函数 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
}
}
我可以这样做吗?我还可以做些什么?我可以永远返回某种类型的东西,也许,但是我怎样才能得到一个永远不会返回的“值”呢?
解决方案
您是否尝试过函数重载:
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;
}
}
推荐阅读
- c++ - 在 Linux 上使用 g++ 输出错误,在 Windows 上更正
- xamarin.forms - 如何在 Android 的 xamarin 表单中使用 STEP_COUNT_SENSOR 计算步数
- java - Spring Boot 1 数据库多数据库用户
- javascript - 可拖动的 div 应避免 x 和 y 重叠
- javascript - 如何在功能模块组件中使用material2-carousel
- javascript - 组合函数添加新参数
- android - 如何在 Constraintlayout 中为 Barrier 指定边距
- python - 如何用每个条目的适当排名替换张量的条目?
- python - 在 pandas 列中替换(国际电话号码)
- python - 如何找到子元素