본문 바로가기

카테고리 없음

2022년 1월 4일 개발일지

새해복 많이받으세요 !!

 

타입스크립트 공부 ! 

 

void : 어떤 타입도 가지지않는 빈 상태 (리턴이 없는것을 void 로 지정 )

 

타입시스템

- 컴파일러에게 사용하는 타입을 명시적으로 지정하는 시스템

- 컴파일러가 자동으로 타입을 추론하는 시스템 

 

타입스크립트의 타입 시스템 

- 타입을 명시적으로 지정할 수 있습니다 .

- 타입을 명시적으로 지정하지 않으면 , 타입스크립트 컴파일러가 자동으로 타입을 추론 

 

function f3(a) {

return a * 38 ;

console.log(f3('Mark') + 5 ) // NaN

 

nolmplicitAny 옵션을 켜면

타입을 명시적으로 지정하지 않은 경우 , 타입스크립트가 추론중 'any' 라고 판단하게 되면 , 컴파일 에러를 발생시켜

명시적으로 지정하도록 유도합니다 .

 

strictNullChecks 옵션을 켜면

모든 타입에 자동으로 포함되어 있는 'null' 과 'undefined'를 제거해줍니다 .

 

function f4(a : number) {
if (a > 0) 
   return a * 38
}
console.log(f4(-5) + 5); //error TS2532 : Object is possibly 'undefided'

nolmplictReturns 옵션을 켜면

함수 내에서 모든 코드가 값을 리턴하지 않으면 , 컴파일 에러를 발생시킵니다 .

 

매개변수에 object가 들어오는 경우

 

function f6(a) {
 return `이름은 ${a.name} 이고 , 
 연령대는 ${Math.floor(a.age / 10} * 10}대 입니다 .`;
}
console.log(f6('Mark')); // 이름은 undefined이고 , 연령대는 NaN대 입니다 .

 

object literal type을 지정하면 ?

 

function f6(a : {name : string , age : number}): string {
 return `이름은 ${a.name} 이고 , 
 연령대는 ${Math.floor(a.age / 10} * 10}대 입니다 .`;
}
console.log(f6('Mark')); // error TS2345: Argument of type 'string' is not 
assignable to parameter of type '{name : string , age : number}'.

 

Structural Type Sysyem vs Nominal Type System

타입스크립트는 Structural Type Sysyem을 따르고 있습니다 - 이름이 달라도 구조가 같으면 , 같은 타입입니다.

 

interface IPerson {
name : string ;
age : number ;
speak() : string ;
}

type PersonType = {
name : string ;
age : number;
speak() : string ;
}
let personInterface : IPerson = {} as any;
let personType : PersonType = {} as any;

personInterface = personType; 
personType = personInterface;

 

personInterface 와 personType은 구조가 같아서 같은 타입으로 취급됩니다 .

 

nominal type system - 구조가 같아도 이름이 다르면 , 다른 타입입니다 .

 

type PersonID = string & { readonly brand : unique symbol };

function PersonID( id: string ) : PersonID {
  return id as PersonID
}

function getPersonById (id : PersonID) {}

getPersonByID(PersonID('id-aaaaaa'));
getPErsonById('id-aaaaaa'); // error TS2345: Argument of type 'string' is not
assignable to parameter of type 'PersonID'. Type 'sytring' is not assignable to type 
'{ readonly brand : unique symbol; }'.

 

타입 호환성

서브타입 , 슈퍼타입

 

서브타입  

 

//sub 1 타입은 sup1  타입의 서브 타입입니다.
let sub1 : 1 = 1;
let sup1 : number = sub1;
sub1 = sup1; //error Type 'number' is not assignable to type '1'.

// sub2 타입은 sup2 타입의 서브 타입입니다.
let sub2 : number[] = [1];
let sup2 : object = sub2;
sub2 = sup2 ; // error! Type '{}' is missing the following properties from type 'number[]':
length , pop , push , concat , and 16 more .

//sub 3 타입은 sup3 타입의 서브 타입입니다 .
let sub3 : [number , number] = [1 , 2];
let sup3 : number[] = sub3 ;
sub3 = sup3 // error ! Type 'number[]' is not assignable to type '[number ,number]' . Target
requires 2 element(s) but source may have fewer.

//sub 4 타입은 sup4 타입의 서브 타입입니다.
let sub4: number = 1 ;
let sup4 : any = sub4;
sub4 = sup4;

//sub 5 타입은 sup5 타입의 서브 타입입니다 .
let sub5: never = 0 as never;
let sup5 : number = sub5;
sub5 = sup5 // error ! Type 'number' is not assignable to type 'never'

class Animal {} 
class Dog extends Animal {
  eat() {}
}

//sub6 타입은 sup6 타입의 서브 타입입니다 .
let sub6 : Dog = new Dog();
let sup6 : Animal = sub6;
sub6 = sup6; // error! Property 'eat' is missing in type 'SubAnimal' but required in type
'SubDog' .