TypeScript:标记模板文字显示错误

Hit*_*mar 8 javascript typescript template-literals

我试图使用ES5的标记模板文字与打字稿,但似乎类型脚本没有完全支持它.我有以下一段代码.

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 }`;
    }
}
Run Code Online (Sandbox Code Playgroud)

toString方法中,typescript向我显示以下错误.

Argument of type 'TemplateStringsArray' is not assignable to parameter of type 'string[]'.
Property 'push' is missing in type 'TemplateStringsArray'.
Run Code Online (Sandbox Code Playgroud)

我不知道为什么它会向我显示这个错误.根据mozilla的文档"标记函数的第一个参数包含一个字符串值数组." 所以它应该接受字符串数组.但实际的期望是TemplateStringsArray.不确定如何以及何时interface TemplateSringsArray定义.目前我正在使用TemplateSringsArray类型来避免此错误.任何人都可以解释发生了什么.谢谢.这是操场.

Hit*_*mar 10

经过更多探索,我终于在更改日志中找到了解释.希望它会帮助某人.它说

ES2015标记模板总是将它们的标记传递给一个不可变的类数组对象,该对象具有一个名为raw的属性(也是不可变的).TypeScript将此对象命名为TemplateStringsArray.

方便的是,TemplateStringsArray可以分配给一个数组,因此用户可以利用它来为其标记参数使用更短的类型:

function myTemplateTag(strs: string[]) {
    // ... 
} 
Run Code Online (Sandbox Code Playgroud)

但是,在TypeScript 2.0中,该语言现在支持readonly修饰符,并且可以表示这些对象是不可变的.因此,TemplateStringsArray也已变为不可变,并且不再可分配给string [].

建议:

TemplateStringsArray明确使用(或使用ReadonlyArray<string>).