Skip to content
← Back to rules

typescript/restrict-template-expressions 정확성

This rule is turned on by default when type-aware linting is enabled.
💭 This rule requires type information.

동작 방식

이 규칙은 템플릿 리터럴 표현식에서 허용되는 타입을 제한합니다.

왜 좋지 않은가?

템플릿 리터럴은 삽입된 값에 대해 toString()을 호출합니다. 일부 타입은 의미 있는 문자열 표현이 없는 경우가 있습니다 (예: 객체는 "[object Object]"로 변환됨) 또는 toString 메서드 자체가 전혀 존재하지 않을 수도 있습니다. 이 규칙은 템플릿 표현식에서 적절한 타입만 사용되도록 보장하는 데 도움이 됩니다.

예시

이 규칙에 부적합한 코드 예시:

ts
declare const obj: object;
declare const sym: symbol;
declare const fn: () => void;
declare const arr: unknown[];

// 객체는 "[object Object]"로 변환됨
const str1 = `값: ${obj}`;

// 심볼은 예상과 다를 수 있음
const str2 = `심볼: ${sym}`;

// 함수는 소스 코드나 "[Function]"으로 변환됨
const str3 = `함수: ${fn}`;

// 배열은 예상대로 포맷되지 않을 수 있음
const str4 = `배열: ${arr}`;

// undefined/null은 "undefined"/"null"로 변환되어 혼란스러울 수 있음
declare const maybeValue: string | undefined;
const str5 = `값: ${maybeValue}`; // "값: undefined"일 수 있음

이 규칙에 적합한 코드 예시:

ts
declare const str: string;
declare const num: number;
declare const bool: boolean;
declare const obj: object;

// 안전한 타입
const result1 = `문자열: ${str}`;
const result2 = `숫자: ${num}`;
const result3 = `불리언: ${bool}`;

// 복잡한 타입에 대한 명시적 변환
const result4 = `객체: ${JSON.stringify(obj)}`;
const result5 = `배열: ${arr.join(", ")}`;

// undefined/null을 명시적으로 처리
declare const maybeValue: string | undefined;
const result6 = `값: ${maybeValue ?? "N/A"}`;
const result7 = `값: ${maybeValue || "기본값"}`;

// 미확인 값에 대한 타입 가드
declare const unknown: unknown;
const result8 = typeof unknown === "string" ? `값: ${unknown}` : "유효하지 않음";

구성

이 규칙은 다음 속성을 가진 구성 객체를 수락합니다.

allow

type: array

기본값: [{"from":"lib", "name":["Error", "URL", "URLSearchParams"]}]

템플릿 표현식에서 허용되는 추가 타입이나 값 지정자를 포함하는 배열입니다. 기본값으로 lib에서 제공하는 Error, URL, URLSearchParams가 포함됩니다.

allow[n]

type: string

특정 선언을 매칭하기 위한 타입 또는 값 지정자

다음 네 가지 유형의 지정자가 지원됩니다:

  1. 문자열 지정자 (사용 중단됨): 이름으로 전역 매칭
json
"Promise"
  1. 파일 지정자: 로컬 파일에서 선언된 타입/값 매칭
json
{ "from": "file", "name": "MyType" }
{ "from": "file", "name": ["Type1", "Type2"] }
{ "from": "file", "name": "MyType", "path": "./types.ts" }
  1. 라이브러리 지정자: TypeScript 내장 라이브러리 타입 매칭
json
{ "from": "lib", "name": "Promise" }
{ "from": "lib", "name": ["Promise", "PromiseLike"] }
  1. 패키지 지정자: npm 패키지에서 가져온 타입/값 매칭
json
{ "from": "package", "name": "Observable", "package": "rxjs" }
{ "from": "package", "name": ["Observable", "Subject"], "package": "rxjs" }

allowAny

type: boolean

기본값: true

템플릿 표현식에서 any 타입 값을 허용할지 여부.

allowArray

type: boolean

기본값: false

템플릿 표현식에서 배열 타입을 허용할지 여부.

allowBoolean

type: boolean

기본값: true

템플릿 표현식에서 불리언 타입을 허용할지 여부.

allowNever

type: boolean

기본값: false

템플릿 표현식에서 never 타입을 허용할지 여부.

allowNullish

type: boolean

기본값: true

템플릿 표현식에서 null 또는 undefined와 같은 nullish 타입을 허용할지 여부.

allowNumber

type: boolean

기본값: true

템플릿 표현식에서 숫자 및 bigint 타입을 허용할지 여부.

allowRegExp

type: boolean

기본값: true

템플릿 표현식에서 RegExp 값들을 허용할지 여부.

사용 방법

구성 파일 또는 CLI를 통해 이 규칙을 활성화하려면 다음을 사용하세요:

json
{
  "rules": {
    "typescript/restrict-template-expressions": "error"
  }
}
bash
oxlint --type-aware --deny typescript/restrict-template-expressions

참고 문서