網站搜尋

javascript - TypeScript:標記模板字面量顯示錯誤


我正在嘗試在 TypeScript 中使用 ES5 的標記模板字面量,但看起來 TypeScript 並不完全支持它。我有如下的程式碼片段。

class TemplateLiterals { 
    age: number = 24;
    name: 'Luke Skywalker'
    private tag(strings: string[], personExp, ageExp) :string{
        var str0 = strings[0]; // "that "
        var str1 = strings[1]; // " is a "
        var ageStr;
        if (ageExp > 99) {
            ageStr = 'centenarian';
        } else {
            ageStr = 'youngster';
        }
        return str0 + personExp + str1 + ageStr;
    }
    toString() {
        return this.tag `that ${ this.name } is a ${ this.age }`;
    }
}

在 toString 方法中,TypeScript 顯示了以下錯誤。

Argument of type 'TemplateStringsArray' is not assignable to parameter of type 'string[]'.
Property 'push' is missing in type 'TemplateStringsArray'.

我不知道為什麼它會顯示這個錯誤。根據 Mozilla 的文檔「標籤函數的第一個參數包含一個字符串值的陣列。」所以它應該接受字符串陣列。但實際期望的是 TemplateStringsArray。不確定 interface TemplateStringsArray 是怎麼及何時被定義的。目前我使用 TemplateStringsArray 類型來避免這個錯誤。有人可以解釋發生了什麼嗎?謝謝。這是 playground。

答案#1

在進一步探索之後,我終於在更改日誌中找到了說明。希望這對某些人有所幫助。它說

ES2015 標記模板總是將一個不可變的類陣列物件傳遞給它的標記,該物件有一個名為 raw 的屬性(這個屬性也是不可變的)。TypeScript 將這個物件命名為 TemplateStringsArray。

方便的是,TemplateStringsArray 可以被指定給 Array,因此使用者可能利用這一點,對他們的標籤參數使用更簡短的類型:

function myTemplateTag(strs: string[]) {
    // ... 
} 

然而,在 TypeScript 2.0 中,該語言現在支援 readonly 修飾符,並且可以表示這些物件是不可變的。因此,TemplateStringsArray 也被設為不可變,並且不再可以被指派給 string[]。

建議:

明確使用 TemplateStringsArray(或使用 ReadonlyArray<string>)。