簡體   English   中英

typescript 字符串或自定義類型

[英]typescript string or custom type

我有以下內容:

type gio = {
    metadata: any;
}


let a:gio | string;

問題:鍵入a.metadata會產生錯誤Property 'metadata' does not exist on type 'string | gio'. Property 'metadata' does not exist on type 'string | gio'.

嘗試這個:

 type gio = { metadata: any; } let a: gio | string; if(typeof a.== 'string'){ a.metadata }

| 將采用這兩種類型中包含的所有屬性 - 所以它的類型將是giostring之間的公共屬性。 由於string沒有metadata屬性,因此它不會包含在最終類型中。 你需要的是&

type gio = {
    metadata: any;
}

let a:gio & string;

這樣 gio 和 string 的屬性將結合起來,您將能夠訪問a.matadata

編輯: snaksa使用交集類型的答案將起作用,但不同之處在於let a: gio & string意味着任何設置為a的值都必須是有效的gio有效的字符串,這意味着它必須具有元數據字段並且string 的所有成員(length、indexOf()、trim() 等)。 類似於寫interface MyNewType implements gio, string


從文檔:

TypeScript 僅允許您與工會做事,前提是該事情對工會的每個成員都有效。

例如,如果gio被定義為:

type gio = {
    metadata: any;
    length: number;
}

您可以訪問a.length因為giostring都有一個長度字段。
另一方面,您不能訪問a.metadata因為a可能是string ,也不能訪問a.indexOf() ,因為它可能是gio

解決方案是用代碼縮小聯合范圍......
例如,TypeScript 知道只有字符串值才會有 typeof 值“string”:

因此,正如 Dor ben Itzhak 回答的那樣

if(typeof a !== 'string') { 
   // a is not a string, therefore it is gio
    a.metadata
} else { 
   // a is a string
   a.indexOf("foo")
}

或者,如果你想告訴 ts“相信我,這是一個 gio”,你可以使用type assertion

(a as gio).metadata

作為記錄, 文檔中有一個完整的部分用於更復雜的縮小

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM