[英]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.