2015-08-21 156 views
0

我創建的代碼樣本塊,顯示在打字稿語法錯誤,但運行良好,如JavaScript:TypeScript Sandbox錯誤2339與||和聯盟類型

基本上,當我試圖使用||OR)運算符collaese一個對象屬性,可能是undefined TypeScript它表示屬性不存在,我知道這是爲什麼我使用||

class Person { 
    name: string; 
    job: string; 
} 

var person1:Person = {name: 'hi', job: 'yes'}; 
var name = 'bye'; 

function showName(person1:Person | string) { 
    var personsName: string = person1.name || person1; 

    document.write(personsName); 
    document.write('<br />'); 
} 

showName(person1); 
showName(name); 

輸出是完全按照我希望它是:

hi 
bye 

然而,打字稿顯示了person1.name語法錯誤。爲什麼?什麼是正確的TypeScript方法呢?

+2

你的代碼對某人將'name'屬性賦值給'String.prototype'或將'person1.name'賦值爲''「'(在這種情況下,你可能會看到'[Object object ]'或類似的東西也沒用)。 David Sherret的回答在這方面非常有用。 –

回答

2

我建議使用type guard

function showName(person1: Person | string) { 
    var personsName = (typeof person1 === "string") ? person1 : person1.name; 

    document.write(personsName); 
    document.write('<br />'); 
} 

注意,當person1null || undefined這個代碼將拋出一個錯誤,但這樣做的原代碼。有很多不同的方式來處理,所以我會留給你。

+0

這個答案雖然沒有直接回答我的問題,但回答了我應該問的問題。謝謝。 – cjbarth

0

由於操作數是聯合類型,您需要在表達式中聲明該類型。即

var personsName: string = (<Person>person1).name || <string>person1; 
+0

評論直接回答我的問題。我不知道爲什麼它被低估。這個答案可以適用於TypeScript中的其他類型轉換情況。 – cjbarth