새해복 많이받으세요 !!
타입스크립트 공부 !
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' .