TypeScript 4.9 공식 릴리스 노트
https://devblogs.microsoft.com/typescript/announcing-typescript-4-9-beta/#the-satisfies-operator
새로운 satisfies 연산자는 표현식의 타입이 특정 타입과 일치하는지 검증하면서 해당 표현식의 결과 타입을 변경하지 않습니다.
새로운 satisfies 연산자는 표현식의 타입이 특정 타입과 일치하는지 검증하면서 해당 표현식의 결과 타입을 변경하지 않습니다.
이 말의 의미는 무엇일까요? '표현식의 결과 타입을 변경하지 않는다'는 것은 어떤 의미일까요?
/* TypeB 타입 정의 */
interface TypeB {
value: number | string
}
const data = {
value: 42
} satisfies TypeB
/**
위 코드의 의미:
data가 TypeB 타입과 일치함을 보장하면서도,
data의 실제 타입은 다음과 같이 유지됩니다:
{
value: number
}
따라서 data.value.toFixed(2)를 사용할 때,
타입 단언이 필요하지 않습니다:
const num = data.value as number
num.toFixed(2)
**/
satisfies는 다양한 잠재적 오류를 포착하고 객체가 특정 데이터 타입과 일치하는지 확인할 수 있도록 도와줍니다 (객체 자체의 타입은 변경하지 않음).
본문
이제 satisfies의 사용 사례를 예시를 통해 소개하겠습니다.
기존 버전의 타입 검증 방식
설명에 앞서, 이전 버전의 타입 검증 방식을 먼저 살펴보겠습니다:
interface ISetting {
width: string | number
}
/**
* 🟡 사례 1 - 이전 방식에서는 첫 번째 선언에서 오류가 발생하지만,
* legacy.width 사용 시에는 오류가 발생하지 않습니다. (오류가 발생해야 함, width가 정의되지 않았으므로)
*/
const legacy: ISetting = {}
// ^^^^^^ "{}" 타입에 "width" 속성이 없지만 "ISetting" 타입에는 필요합니다.
legacy.width
// ^ (속성) ISetting.width: string | number
/**
* 🔴 사례 2 - 또 다른 이전 방식에서는 선언과 사용 시 모두 오류가 발생하지 않습니다. 큰 오류!
*/
const legacyAs = {} as ISetting
// 오류 없음
legacyAs.width
// ^ (속성) ISetting.width: string | number
TypeScript 4.9의 새로운 방식: satisfies
TypeScript 4.9부터는 위 문제를 해결하기 위해 다음과 같이 코딩해야 합니다:
interface ISetting {
width: string | number
}
/**
* 🟢 사례 3 - 새로운 방식에서는 첫 번째 선언에서 오류가 발생하며,
* 사용 시에도 오류가 발생하여 완벽한 타입 검증이 가능합니다
*/
const current = {} satisfies ISetting
// ^^^^^^^ "{}" 타입이 "ISetting" 타입을 만족하지 않습니다.
current.width
// ^ "{}" 타입에 "width" 속성이 존재하지 않습니다
/**
* 🟢 사례 4 - 값을 추가한 경우,
* width를 사용할 때 선언한 타입으로 자동 추론됩니다! 더 이상 유니온 타입이 아닙니다.
*/
const currentWithValue = { width: 30 } satisfies ISetting
// 오류 없음
currentWithValue.width.toFixed()
// ^ (속성) width: number 🥰
TypeScript 4.9 이후부터는 타입 단언(as)을 사용할 때마다 satisfies를 고려해보세요 😎
참고 자료: