2017-02-28 41 views
6

我正嘗試使用帶打字機的ES5的tagged template literal,但好像類型腳本沒有完全支持它。我有以下一段代碼。TypeScript:Tagged Template Literals顯示錯誤

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。不知道如何以及何時定義interfaceTemplateSringsArray。目前我正在使用TemplateSringsArray類型來避免此錯誤。任何人都可以請解釋發生了什麼。謝謝。這是playground

回答

4

經過探索更多,我終於在change log找到解釋。希望它能幫助別人。它說

ES2015標籤模板總是通過他們的標籤,有一個稱爲原始屬性(這也是不可改變的)一個不變的陣列狀 對象。 TypeScript將此對象命名爲TemplateStringsArray。

便利,TemplateStringsArray是分配到一個數組, 所以這是可能的用戶正是利用這一點來使用較短的類型 爲自己的代碼參數:

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

然而,打字稿2.0,該語言現在支持只讀修飾符,並且可以表示這些對象是不可變的。由於 的一個結果,TemplateStringsArray也被製作爲不可變的,並且不是 可分配給string []。

建議:

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

1

我也無法找到任何文件約TemplateStringsArray - 但如果你只是通過改變參數TemplateStringsArray而非string[]忽略錯誤(和修復名成員中的錯誤),它似乎工作確定

class TemplateLiterals { 
    age: number = 24; 
    name: string = 'Luke Skywalker' 
    private tag(strings: TemplateStringsArray, 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 }`; 
    } 
} 

var luke: TemplateLiterals = new TemplateLiterals() 
console.log(luke.toString()) 
+0

'目前我正在使用TemplateSringsArray類型來避免此錯誤.' –