문자열의 유형 확장

7212 단어 typescript

문제



type Roles = "student" | "teacher"; 

type Person = {
    role: Roles; 
    name: string; 
    age: number; 
}

function doSomethingWithPerson(person: Person) {
    console.log(person); 
}

const andy = {
    role: "teacher", 
    name: "andy", 
    age: 31
};

doSomethingWithPerson(andy); //Argument of type '{ role: string; name: string; age: number; }' is not assignable to parameter of type 'Person'.

Playground Link

이 코드는 오류를 생성합니다.

Argument of type '{ role: string; name: string; age: number; }' is not assignable to parameter of type 'Person'.
  Types of property 'role' are incompatible.
    Type 'string' is not assignable to type 'Roles'.

무슨 일이야?

우리가 선언한 andy 객체가 함수가 원하는 유형Person과 일치하는데 TypeScript가 불평하는 이유는 무엇입니까?

빠른 솔루션



문자열 선언 "teacher" as const
const andy = {
    role: "teacher" as const, 
    name: "andy", 
    age: 31
};

doSomethingWithPerson(andy);

설명



이 시나리오에서 객체 andy를 선언하면 TypeScript는 role 속성의 유형을 string , 모든 문자열로 유추합니다!
"teacher""student"는 문자열이지만 문자열의 하위 집합입니다.
Person 유형은 문자열을 원하지 않고 두 개의 특정 문자열만 원합니다.

TypeScript는 stringtype widening이라고 불리는 것이 아니라 "teacher"로 유형을 유추합니다.

TypeScript가 하는 일은 나중에 다음과 같은 코드를 작성할 수 있도록 합니다.

   andy.role = "foobar"; 

(즉, andy 개체를 변경하고 있습니다).
as const 키워드가 하는 일은 유형 확장을 방지하는 것입니다. See the documentation here .

당신이 하고 있는 것은 TypeScript에 '걱정하지 마세요. 이 속성을 재할당하지 않을 것이라고 약속합니다'라고 말하는 것입니다. 시도하면 TypeScript에서 오류가 발생합니다.

const andy = {
    role: "teacher" as const, 
    name: "andy", 
    age: 31
};

andy.role = "foobar"; //Type '"foobar"' is not assignable to type '"teacher"'.(2322) 

대체 솔루션



문자열 선언 "teacher" as "teacher"
const andy = {
    role: "teacher" as "teacher", 
    name: "andy", 
    age: 31
};

doSomethingWithPerson(andy);

이것은 유형 확장을 방지하기 위해 as const 키워드를 사용하는 대신 role 속성의 유형을 "teacher" 로 명시적으로 설정합니다.
as constas "teacher" 모두 동일한 최종 효과를 가지며 role 속성 유형은 "teacher" 입니다.

좋은 웹페이지 즐겨찾기