[英]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 }
該|
將采用這兩種類型中包含的所有屬性 - 所以它的類型將是gio
和string
之間的公共屬性。 由於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
因為gio
和string
都有一個長度字段。
另一方面,您不能訪問a.metadata
因為a
可能是string
,也不能訪問a.indexOf()
,因為它可能是gio
解決方案是用代碼縮小聯合范圍......
例如,TypeScript 知道只有字符串值才會有 typeof 值“string”:
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.