2017-02-28 2 views
6

typescript와 함께 tagged template literal의 ES5를 사용하려고 시도하고 있지만 형식 스크립트가이를 완벽하게 지원하지 않는 것 같습니다. 나는 다음과 같은 코드를 가지고있다.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 방법에서, 다음과 같은 오류가 표시됩니다.

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

왜이 오류가 나에게 표시되는지 알 수 없습니다. 모질라의 문서에 따르면 "태그 함수의 첫 번째 인수에는 문자열 값 배열이 들어 있습니다." 그래서 그것은 문자열 배열을 받아 들여야합니다. 그러나 실제 기대치는 TemplateStringsArray입니다. interfaceTemplateSringsArray을 정의하는 방법과시기를 잘 모름 현재이 오류를 방지하려면 TemplateSringsArray 유형을 사용하고 있습니다. 누구든지 무슨 일이 일어 났는지 설명해 주시겠습니까? 감사. playground은 다음과 같습니다.

나는 또한 모든 문서에 대한 TemplateStringsArray를 찾을 수 없습니다

답변

4

더 자세히 살펴본 후 change log에서 설명을 찾았습니다. 누군가가 도움이되기를 바랍니다. 그것은

이라고 말합니다. ES2015 태그가 지정된 템플릿은 항상 raw (불변의 것도 있습니다)라는 속성을 가진 불변의 배열 모양의 객체와 같은 태그를 전달합니다. TypeScript는이 개체의 이름을 TemplateStringsArray로 지정합니다.

편리 TemplateStringsArray가 배열에 할당했다 그래서 그것의 가능한 사용자는 태그 매개 변수에 대한 짧은 타입 을 사용하려면이 이용했다 :

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

그러나, 타이프 라이터 2.0, 언어는 이제 읽기 전용 수정자를 지원하며 은 이러한 객체가 변경 불가능하다는 것을 나타낼 수 있습니다. 결과에 따라 TemplateStringsArray도 변경할 수 없으며 더 이상 문자열 []에 할당 할 수있는 이 없습니다.

권장 사항 :

사용 TemplateStringsArray 명시 적으로 (또는 ReadonlyArray<string>를 사용).

1

-하지만 당신은 그냥 확인을 작동하는 것 같다 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 유형을 사용하고 있습니다 .' –

관련 문제