我有一个简单的函数,它使用union类型和boolean
作为参数,并且无法通过Typescript键入它。
我有这个代码(playground here):
type A = 'a' | 'A';
function f(a: A, b: boolean): string {
if (b) {
switch (a) {
case 'a': return '';
case 'A': return '';
}
} else {
switch (a) {
case 'a': return '';
case 'A': return '';
}
}
}
编译器(启用strictNullChecks
时)告诉我Function lacks ending return statement and return type does not include 'undefined'.
我真的不想添加default
案例,因为这里的目标是确保当我在A
中添加新类型时,我在f
中正确处理它们。我不知道我错过了哪个分支。
我可以通过写作来修复它(参见链接的游乐场):
function g(a: A): string {
switch (a) {
case 'a': return '';
case 'A': return '';
}
}
function f2(a: A, b: boolean): string {
if (b) {
return g(a);
} else {
return g(a);
}
}
(当然在现实生活中我需要两个不同的g函数,但对于打字问题,这并不重要)。
如何在不引入像f
这样的中间函数的情况下让typescript编译g
?
您可以添加default
案例来修复它,例如
function f(a: A, b: boolean): string {
if (b) {
switch (a) {
case 'a': return '';
case 'A':
default: return '';
}
} else {
switch (a) {
case 'a': return '';
case 'A':
default: return '';
}
}
}
你也可以通过使用never
类型来修复它,例如
function f(a: A, b: boolean): string {
if (b) {
switch (a) {
case 'a': return '';
case 'A': return '';
default:
const _exhaustiveCheck: never = a;
return _exhaustiveCheck;
}
} else {
switch (a) {
case 'a': return '';
case 'A': return '';
default:
const _exhaustiveCheck: never = a;
return _exhaustiveCheck;
}
}
}