보조적인 기능을 목적으로 만들었기 때문에 태생적 한계가 존재.
npm i -g typescript
tsc --version
tsconfig.json
파일 생tsc --init
Type X is not assignable to type Y
let rocker :string;
rocker = "seyoung";
let name : string = "seyoung";
let name = "seyoung"; // string type임을 자동으로 추론한다.
let score = 20;
let result : string | number = scroe < 80 : "불합격" : score;
값 할당을 통한 내로잉
let inventory : string | number = "water";
inventory.toUppercase(); //WATER
invertory.toFixed();
// Error : Property 'toFixed; does not exist on type 'string'
조건 검사를 통한 내로잉
typeof 검사를 통한 내로잉
값 자체를 타입으로 사용하는 것
변수가 제한된 값들을 가질 때 안전하게 제한하여 사용할 수 있다.
유니온 타입으로 지정
type btnType = "default" | "error";
type btnColor = "red" | "black" | "green";
type btnStyele = `${btnType}-${btnColor}`
const는 변경이 불가능typescript에서 자동으로 literal type으로 추론한다.
as const
를 변수 선언 후 뒤에 추가하면 literal type으로 추론해준다.
const Color = {
red : "FF2031",
black : "000000"
} as const
type RawData = boolean | number | string | null
type Id = number | string;
type IdMaybe = Id | undefined | null;
let poetLate :{
born:number;
name:string;
} = {
born:1935,
name:"seyoung"
}
type Poet = {
born:number;
name:string;
}
let poetLate :Poet = {
born:1995,
name:"seyoung"
}
type FirstAndLastNames = {
first: string;
last : string;
}
const hasBoth : FirstAndLastNames = {
first:"Sarojini",
last:"Naidu"
}
const hasOnlyOne : FirstAndLastNames = {
first:"Sappho"
// Error :
// Property 'last' is missing in type '{ first: string; }' but required in type 'FirstAndLastNames'.
}
type Poet = {
born : number;
name : string;
}
const existingObject = {
activity : "walking",
born:1233,
name:"seyoung"
}
const extraPropertyButOk: Poet = existingObject;
type Author = {
firstName : string;
lastName: string;
}
type Poem = {
author : Author;
name: string;
}
const PoemMismatch : Poem = {
author : {
name:"seyoung"
// Error : Type '{ name: string; }' is not assignable to type 'Author'.
// Object literal may only specify known properties, and 'name' does not exist in type 'Author'.
},
name:"young"
}
?
를 추가하면 해당 속성은 생략가능해진다.const poem = Math.random() > 0.5 ? { name:"크다", pages:7} : { name:"작다", rhymes:true}
// 타입스크립트가 자동으로 추론한 타입
// {
// name: string;
// pages: number;
// rhymes?: undefined;
// } | {
// name: string;
// rhymes: boolean;
// pages?: undefined;
// }
type PoemWithPages = {
name:string;
pages:number;
}
type PoemWithRhymes = {
name:string;
rhymes:boolean;
}
type Poem = PoemWithPages | PoemWithRhymes;
const poem: Poem = Math.random() > 0.5 ? { name:"크다", pages:7} : { name:"작다", rhymes:true}
type PoemWithPages = {
name:string;
pages:number;
}
type PoemWithRhymes = {
name:string;
rhymes:boolean;
}
type Poem = PoemWithPages | PoemWithRhymes;
const poem: Poem = Math.random() > 0.5 ? { name:"크다", pages:7} : { name:"작다", rhymes:true}
if("pages" in poem){
console.log(poem.pages) // PoemWithPages로 좁혀짐
} else {
console.log(poem.rhymes) // PoemWithRhymes로 좁혀짐
}
type PoemWithPages = {
name:string;
pages:number;
type:'pages';
}
type PoemWithRhymes = {
name:string;
rhymes:boolean;
type:'rhymes';
}
type Poem = PoemWithPages | PoemWithRhymes;
const poem: Poem = Math.random() > 0.5
? { name:"크다", pages:7, type:'pages'}
: { name:"작다", rhymes:true, type:'rhymes'}
if(poem.type === "pages"){
console.log("pages")
} else {
console.log("rhymes")
}
|
연산자로 둘 중 하나의 타입을 나타낸다면&
연산자로 여러 타입을 묶어서 교차시키는 것도 가능하다.&
, |
연산자를 결합하여 타입을 표현할 수도 있다.type ShortPoemBase = {author : string};
type Haiku = ShortPoemBase & {kiho : string; type :'haiku'}
type Villanelle = ShortPoemBase & {meter : number; type :'villanelle'}
type ShortPoem = Haiku | Villanelle;