이렇게 하면 간단합니다. 타입스크립트가 알아서 "hello" 리터럴 타입으로 추론하므로 굳이 let으로 변수를 선언하여 리터럴 타입을 표기할 이유가 없습니다. 다만 리터럴 타입이 아닌 자료형 타입은 let과 함께 자주 사용됩니다.
let str: string = 'hello';
str = 'world';
str = 123;
// Type 'number' is not assignable to type 'string'.
이제 'world'는 대입할 수 있지만, 123은 대입할 수 없습니다. 아직 let의 자유도를 제한받고 있다는 느낌에 답답할 수 있습니다. 하지만 잘 생각해보면 let 변수에 다른 자료형의 값을 대입하는 경우가 생각보다 많지 않습니다. 대부분의 변수는 같은 자료형 내에서 값이 움직입니다.
'hello', 123, false 같은 원시 자료형에 대한 리터럴 타입 외에도 객체를 표시하는 리터럴 타입이 있습니다.
const obj: { name: 'zero' } = { name: 'zero' };
const arr: [1, 3, 'five'] = [1, 3, 'five'];
const func: (amount: number, unit: string) => string
= (amount, unit) => amount + unit;