void
함수에는 return 값
을 넣으면 안된다.( undefined
는 가능, null
은 불가능)void
인 경우에는 return 값
이 존재해도 된다.void
를 메서드나 매개변수로 사용하더라도 해당 변수 자체는 반환값을 나타내지 않는다.void
는 실제 return 값
이 뭔지 신경쓰지 않겠다.// Return값이 void
function a(): void{
return undefined;
}
// 메서드가 void
interface Human{
talk: () => void;
}
const human: Human = {
talk() {return 'abc';}
}
// 매개변수가 void
function a(callback:()=> void): void{}
a(()=>{
return 3;
});
declare
을 사용하면 함수의 구현부를 안 만들고 Type만 정의해둘 수 있다.
deflare function forEach(arr: number[], callback: (e1:number) => void):void;
let target: number[] = [];
forEach([1,2,3], e1 => {target.push(e1)});
forEach([1,2,3], e1 => target.push(e1));
// + 강제 타입 변환
const test = a as unknown as number; // test는 number로 바꿔라 내가 책임진다?
any
는 타입 체크를 아예 포기하는 것.
unknown
은 아직까지 타입이 확실하지 않아, 나중에 지정해서 쓸수있게끔 하는 것.
const a: A={
talk() {return 3;}
}
const b: unknown = a.talk();
(b as A).talk();
as
는 unknown
인 경우를 제외하고 가능하면 쓰지 않는 것이 좋다.
function numOrStr(a: number | string){
if(typeof a === 'number'){
a.toFixed(1);
} else{
a.charAt(3);
}
if(typeof a === 'string'){
a.charAt(3);
}
}
배열
function numOrNumArray(a: number | number[]){
if(Array.isArray(a)){
a.concat(4);
} else{
a.toFixed(3);
}
}
클래스
class typeA{
aaa(){}
}
class typeB{
bbb(){}
}
function aOrB(param: typeA | typeB){
// 여기서 typeA는 클래스 자체를 의미하는 것이 아니라 new typeA()을 의미한다.
if(param instanceof typeA){
param.aaa();
}
}
값으로 구분(보통 이걸 사용)
type B = {type: 'b', bbb: string};
type C = {type: 'c', ccc: string};
type D = {type: 'd', ddd: string};
function typeCheck(a: B | C | D){
if(a.type==='b'){
a.bbb;
} else if(a.type === 'c'){
a.ccc;
} else {
a.ddd;
}
}
속성으로 구분 : in 연산자를 사용
function typeCheck(a: B | C | D){
if('bbb' in a){
a.type;
} else if('ccc' in a){
a.ccc;
} else {
a.ddd;
}
}
⭐️⭐️⭐️ 객체를 만들 때 type을 만드는 습관을 가지자.
const human = {type: 'human'}
const dog = {type:'dog'}
const cat = {type:'cat'}
타입가드
: 변수나 객체의 타입을 더 구체적으로 추론하기 위해 사용하는 개념
타입을 구분해주는 커스텀 함수를 직접 만들 수 있다.
return타입에 is
가 들어가 있는 함수는 커스텀 타입 가드 함수이다.
어떨 때 쓰냐? if문 안에 써서 타입스크립트에게 정확한 타입을 가르쳐준다.
interface Cat { meow: number}
interface Dog { bow: number}
// a에 meow라는 고양이가 있다면 false;
function catOrDog(a: Cat | Dog): a is Dog {
if((a as Cat).meow) {
return false;
}
return true;
}
function pet(a: Cat | Dog){
if(catOrDog(a)){
console.log(a.bow);
}
if('meow' in a){
console.log(a.meow);
}
}
{}
, Object
: 모든 타입(객체를 뜻하는 것이 아님) + null,undefined는 제외한다.
unknown
unknown = {} | null | undefined
// 옛날 버전
const z: unknwon = 'hi';
if(z){
z; // z: unknown
}
// 최신 버전
if(z){
z; // z: {}
}
readonly
interface A{
readonly a: string;
}
const aaa: A = {a:'hello', b:'world'};
aaa.a = '123' // 여기서 오류난다. readonly속성이기 때문
인덱스드 시그니처
type A = {[key: string]: number}
const test: A = {a: 5, b: 3}
type B = 'Human' | 'Mammal' | 'Animal';
type Bc={[key in B]: number};
const testB: Bc = {Human:3};
// + interface에서는 |, &을 쓰지 못한다.
코드에서 type Bc같은 부분을 맵드 타입스
라고 부른다.