[英]TypeScript Discriminated Union - Variable Used Before Assigned after Exhaustive If Statements
我正在使用 TypeScript 的可区分联合功能编写一些代码。 我正在详尽地检查if-else if
结构中每种类型的“类型”属性,并使用每个块中的逻辑分配一个变量。 然后,我返回变量。 但是,我收到关于在分配之前使用的返回变量的错误。 代码遵循这种结构(这是一个非常简单的示例来演示问题,因为我的实际代码要复杂得多):
interface One
{
num : "one";
value : string;
}
interface Two
{
num : "two";
value : number;
}
interface SomeComplexObject
{
// Complex properties
}
type Num = One | Two;
function isOne(
obj : Num
) : SomeComplexObject
{
let complex : SomeComplexObject;
if (obj.num === "one")
{
// Create a complex object with one set of parameters
}
else if (obj.num === "two")
{
// Create a complex object with a second set of parameters
}
return complex;
}
我的第一个想法是添加一个 final else
来抛出一个错误,说(在这种情况下) num
的值是无效的,但是由于其他条件是详尽的,所以obj
的类型是never
并且不能使用。
我可以抛出一个超级通用的错误并完成它,但我想知道为什么编译器认为complex
可能是未定义的,但同时认识到条件是详尽的。 有什么我想念的吗?
编辑:我原来的例子似乎引起了一些混乱。 我对其进行了更新,希望能更能代表实际问题。
我以两种方式之一处理这类场景。 通常go用穷举开关。
interface One {
num : "one";
value : string;
}
interface Two {
num : "two";
value : number;
}
interface SomeComplexObject {
// Complex properties
}
type Num = One | Two;
// Exhaustive Switch
function isOne(obj : Num) : SomeComplexObject {
let complex: SomeComplexObject;
switch (obj.num) {
case "one":
complex = {};
case "two":
complex = {};
}
return complex;
}
// Cast obj to any in `never` case
function isOne2(obj : Num) : SomeComplexObject {
let complex: SomeComplexObject;
if (obj.num === "one") {
complex = {};
} else if (obj.num === "two") {
complex = {};
} else {
throw new Error(`Unknown object type ${(obj as any).num}`)
}
return complex;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.