2015-05-03 217 views
1

我一直在使用Typescript 1.4中的聯合類型,並且遇到錯誤的類型不匹配錯誤。Typescript 1.4聯盟類型,錯誤類型錯誤匹配錯誤

這是一個編譯器錯誤還是我錯過了什麼?

錯誤TS2345:類型爲'string |對象'不能分配給'string'類型的參數。 類型'對象'不能分配給類型'字符串'。

/** @inheritdoc */ 
public log(logLevel : LogLevel, message : string|Object, exception?: Exception): void { 
    // Check if the message is of type Object 
    if (Util.isObject(message)) { 
     // Log the message object 
     this.logObject(logLevel, message, exception); 
    } 
    // Check if the message is of type string 
    else if(Util.isString(message)) { 
     // Log the message 
     this.logMessage(logLevel, message, exception); 
    } 
} 

class Util { 

    protected static TYPE_STRING = 'string'; 

    public static isString(object : any): boolean { 
     return (typeof object === Util.TYPE_STRING); 
    } 

    public static isObject(object : any): boolean { 
     return (object instanceof Object); 
    } 

} 

回答

3

的打字稿編譯器不知道與isStringisObject方法你的意圖,無法正確傳輸的類型。您應內嵌式的測試:

/** @inheritdoc */ 
public log(logLevel : LogLevel, message : string|Object, exception?: Exception): void { 
    // Check if the message is of type Object 
    if (message instanceof Object) { 
     // Log the message object 
     this.logObject(logLevel, message, exception); 
    } 
    // Check if the message is of type string 
    else if (typeof message === 'string') { 
     // Log the message 
     this.logMessage(logLevel, message, exception); 
    } 
} 

如果你不想這樣做,你可以改爲斷言類型:

/** @inheritdoc */ 
public log(logLevel : LogLevel, message : string|Object, exception?: Exception): void { 
    // Check if the message is of type Object 
    if (Util.isObject(message)) { 
     // Log the message object 
     this.logObject(logLevel, <Object> message, exception); 
    } 
    // Check if the message is of type string 
    else if(Util.isString(message)) { 
     // Log the message 
     this.logMessage(logLevel, <string> message, exception); 
    } 
} 
+0

完美,我一直在尋找的類型斷言/鑄造。謝謝。 – user634545

+1

這不是鑄造。沒有與斷言有關的運行時檢查。 –

+0

我看到了,因此名稱... – user634545