当您必须在条件上定义变量时,最佳实践是什么。变量在两种(或多种(情况下都具有相同的类型。
我喜欢做的是一个三元运算符:
const foo:string = (is_true) ? 'A' : 'B';
然而,这并不总是可能的。这种情况可能有2种以上的情况,定义可能更复杂。
所以有时我发现自己是这样做的:
let foo:string;
if(is_true){
foo = 'A';
}else{
foo = 'B';
}
或者如果有更多的病例并且类型更复杂:
type FOO = {
name: string
size: number
}
let foo:FOO;
switch(is){
case 0:{
foo = {name: 'A', size: 0};
break;
}
case 1:{
foo = {name: 'B', size: 1};
break;
}
case 2:{
foo = {name: 'C', size: 2};
break;
}
}
即使我可能已经涵盖了所有的可能性,我也不能100%确定。
留给我一个undefined
foo
变量。Typescript会认为foo
的类型将始终是FOO
,但它可能是undefined
类型。
是否应该始终检查变量是否为undefined
?
有没有更优雅的方法?
我认为实现这一点的最简单方法是将开关移动到具有详尽类型检查的类型化函数中:
function getFoo(is: 0 | 1 | 2) {
switch(is){
case 0:{
return {name: 'A', size: 0};
}
case 1:{
return {name: 'B', size: 1};
}
case 2:{
return {name: 'C', size: 2};
}
default:{
const exhaustiveCheck: never = is;
return exhaustiveCheck;
}
}
}
当给定有效值时,这将返回一个与FOO
类型匹配的对象,如果给定无效值或有效值缺少大小写,则返回错误。