2017-06-12 74 views
3

我正在玩交叉點類型,我期望下面的工作?Typescript交叉點類型的解釋

難道有人會對此有所瞭解嗎?

type SomeError = {  
    message: string; 
    code?: number;  
}; 

type SomeResponse = { 
    error: SomeError & { code: string; } 
}; 

const response: SomeResponse = { 
    error: { 
     message: 'neco', 
     code: 'a' 
    } 
}; 

// Type 'string' is not assignable to type 'number'. 

const response2: SomeResponse = { 
    error: { 
     message: 'neco', 
     code: 50 
    } 
}; 

// Type 'number' is not assignable to type 'string'. 
+0

你基本上有'code:string&number'。你怎麼能期望'code'既是一個'數字'和'字符串'?你在尋找[union types](https://www.typescriptlang.org/docs/handbook/advanced-types.html#union-types),你可以將'code'定義爲'number'或'string'嗎? – Saravana

回答

3

正如其他人所指出的那樣,似乎你想要工會類型(與|)。查看docs on advanced typesuse the online REPL來檢驗理論。

以下代碼使用接口和聯合類型在錯誤類型中獲取靈活的數字/字符串代碼。

interface SomeError {  
    message: string; 
    code: number | string;  
}; 

interface SomeResponse { 
    error: SomeError 
} 

const response: SomeResponse = { 
    error: { 
     message: 'neco', 
     code: 'a' 
    } 
}; 

const response2: SomeResponse = { 
    error: { 
     message: 'neco', 
     code: 50 
    } 
}; 

該文檔奠定了交叉路口的使用情況,但似乎你只想特殊化,這其中類型警衛進來,考慮這個功能:

const printErrCode = (code: string | number) => { 
    if(typeof code === "string") { 
     console.error(code); 
    } else { 
     console.error(`Err code: ${code}`); 
    } 
} 

編輯:如果你想玩十字路口,嘗試複製,但它與您的錯誤域。嘗試使錯誤序列化/可記錄/可打印等。然後混入一個普通的錯誤對象(只有一個字符串或東西)與一個可以記錄的對象(如ConsoleLogger的例子)。

3

的問題是,SomeResponse有這種類型code

number & string 

而這不可能有。

您可以檢查這種情況很容易在playground with your code

let test = response.error.code; 

類型的testnumber & string(只需將鼠標懸停在變量名)