TypeScript는 data type을 체크합니다. 아래의 코드는 에러입니다.
let myColorStr: string = Color.Green;
let myTuple: [string, number]; myTuple = ["Hello", 100]; // 가능 myTuple = ["Hello", "World"]; // 에러
enum Color { Red = 1, Green, Blue = 4 } let myColor: Color = Color.Green; console.log(myColor); // 2 출력 myColor = Color.Blue; console.log(myColor); // 4 출력
any 타입은 타입스크립트에서 가장 할 수 있는 일이 많은(most-capable) 타입입니다. 어떤 타입이든 수용할 수 있으면서도 우리가 호출하거나 그 속성에 접근하려고 할 때 타입체킹을 하지 않아도 됩니다. 또한 any 타입의 값은 다른 어떤 타입에도 대입할 수 있습니다.
보통은 이런 점이 매우 유용하지만 어떤 때는 이런 점 때문에 우리는 약간 태만해지기도 합니다.
어떤 때는 가장 할 수 있는 일이 없는(least-capable) 타입을 사용하고 싶을 때도 있습니다. 이는 API에서 이런 신호를 주고 싶을 때 유용합니다. “이것은 어떤 값이든 될 수 있으니 사용 전에 어떤 타입인지 확인하십시오” 이렇게 하면 사용자들은 반환된 값을 안전하게 검사해보게 됩니다.
타입스크립트 3.0에서는 위에서 언급한 일들을 해주는 unknown이라는 새로운 타입이 도입됩니다. any와 마찬가지로 어떤 값이든 unknown에 할당될 수 있습니다. 하지만 any와는 다르게 unknown 타입을 가진 값의 속성에는 접근할 수 없으며 호출하거나 인스턴스(instance)를 만들 수도 없습니다. 또한 unknown 타입의 값은 unknown이나 any에만 할당될 수 있습니다.
대신에 우리는 타입체킹을 수행하거나 타입 시스템에게 우리가 이 타입에 대해 더 잘 알고 있다고 말해줘야 합니다.
<Code typescript> let foo: unknown = 10; function hasXYZ(obj: any): obj is { x: any, y: any, z: any } {
return !!obj &&
typeof obj === "object" &&
"x" in obj &&
"y" in obj &&
"z" in obj;
} Using a user-defined type guard… if (hasXYZ(foo)) { …we're allowed to access certain properties again.
foo.x.prop; foo.y.prop; foo.z.prop;
} We can also just convince TypeScript we know what we're doing by using a type assertion. upperCase(foo as string); function upperCase(x: string) {
return x.toUpperCase();
} </Code>
let myName: string = "홍길동"; let myVoid: void; let myNull: null; let myUndefined: undefined; myName = null; // 불가능 myName = undefined; // 불가능 myVoid = null; // 불가능 myVoid = undefined; // 가능 myNull = null; // 가능 myNull = undefined; // 불가능 myUndefined = null; // 불가능 myUndefined = undefined; // 가능
function error(message: string): never { throw new Error(message); } error("Something Wrong!!"); function infiniteLoop(): never { while (true) { } }
let myVar: any = "Hello World"; let myVarCount: number = (<string>myVar).length; myVarCount = (myVar as string).length; console.log((<number>myVar).toFixed()); // runtime error