[번역] 타입스크립트 5.0 베타 출시 - 2. const Type Parameters

이관형·2023년 2월 20일
1
post-thumbnail

해당글은 https://devblogs.microsoft.com/typescript/announcing-typescript-5-0-beta 글을 번역한 글입니다.

객체의 타입을 추론할때 Typescript는 일반적으로 의미있는 타입을 선택합니다. 예를들어서 아래와 같은 경우에는 names는 string[] 타입으로 추론됩니다.

type HasNames = { readonly names: string[] }
function getNamesExactly<T extends HasNames>(arg: T): T["names"] {
    return arg.names
}

// Inferred type: string[]
const names = getNamesExactly({ names: ["Alice", "Bob", "Eve"]})

하지만 위의 예시처럼이아닌 getNamesExactly 함수가 정확히 무엇을 수행하고 어떻게 사용될 것인지에 따라 더 구체적인 타입이 필요한 경우가 많습니다.

다들 아시는것처럼 지금까지 개발자들은 원하는 타입을 얻기위해서 특정 위치에 const 를 추가하는 것을 권장하였습니다. 아래 예시를 보시죠.

// The type we wanted:
//    readonly ["Alice", "Bob", "Eve"]
// The type we got:
//    string[]
const names1 = getNamesExactly({ names: ["Alice", "Bob", "Eve"]})

// Correctly gets what we wanted:
//    readonly ["Alice", "Bob", "Eve"]
const names2 = getNamesExactly({ names: ["Alice", "Bob", "Eve"]} as const)

예시처럼 const를 사용하는것은 번거럽고 집중하지않으면 까먹기 쉽습니다. Typescript5.0에서, 여러분들은 타입 파라미터 선언에 const 수정자(modifier)를 추가하여 const와 유사한 추론이 기본값이 되도록 할 수 있습니다.

type HasNames = { names: readonly string[] }
function getNamesExactly<const T extends HasNames>(arg: T): T["names"] {
//                       ^^^^^
    return arg.names
}

// Inferred type: readonly ["Alice", "Bob", "Eve"]
// Note: Didn't need to write 'as const' here
const names = getNamesExactly({ names: ["Alice", "Bob", "Eve"] })

const 수정자(modifier)는 변경 가능한 값을 거부하거나 불변 지약 조건을 요구하지 않습니다. 변경 가능한 유형 제약 조건을 사용하면, 예상하지 못한 결과가 발생할 수 있습니다. 아래 예시를 보시죠

declare function fnBad<const T extends string[]>(args: T): void;

// 'T' is still 'string[]' since 'readonly ["a", "b", "c"]' is not assignable to 'string[]'
fnBad(["a", "b" ,"c"]);

위 예시에서, T에 대한 추론타입의 후보는 읽기전용(readonly) ["a","b","c"]이며, 읽기 전용 배열은 변경 가능한 배열이 필요한 곳에서 사용할 수 없습니다. 이 경우 추론은 제약조건으로 되돌아가고 배열은 string[]으로 처리됩니다.

위의 예시를 원하는 의도대로 변경하고싶다면 readonly string[]을 사용하여야합니다.

declare function fnGood<const T extends readonly string[]>(args:T):void

// T is readonly ["a","b","c"]
fnGood(["a","b","c"])

또한, const 수정자(modifier)는 오로지 객체, 배열 및 원시 표현식의 추론에만 효과가 있다는걸 명시하십시오. 그렇기떄문에 as const로 수정하지 않거나 수정할 수 없는 인수는 효과를 볼 수 없습니다.

declare function fnGood<const T extends readonly string[]>(args: T): void;
const arr = ["a", "b" ,"c"];

// 'T' is still 'string[]'-- the 'const' modifier has no effect here
fnGood(arr);
profile
백엔드개발자🖥

0개의 댓글