잉여속성 검사 변수 따로 빼지 않음
interface A { a: string }
const obj1: A = { a: 'hello', b: 'world' };
- 객체 리터럴에서는 잉여 속성 검사라는게 있다.
- 잉여 속성 검사로 인하여 interface A에는 a속성만 들어있는데 obj1에 b속성을 넣었더니 에러가 발생했다.
잉여속성 검사 변수 따로 뺀 버전
interface A { a: string }
const obj = { a: 'hello', b: 'world' };
const obj1: A = obj;
중간에 obj를 따로 변수로 빼면 처음에 b:'world'가 에러가 났었는데 에러가 나지 않는다. 즉 중간에 변수를 하나 끼면 잉여속성검사를 하지 않고 변수가 없으면 잉여 속성 검사를 한다.
function a(): void{
return '3'; //에러
return null; //에러
return undefined; //가능
return; //return만 있거나 return자체가 없거나..가능
}
return에 값이 있으면 에러가 뜬다.undefined는 가능하다. null은 안된다.보통 return값을 아예 없거나 단순히 return만 있거나 한다. 이런 함수들이 return타입이 void가 된다.
3가지 경우의 void
function a(callback: ()=> void ): void {
}
a(() => { //매개변수의 void는 return값이 존재 가능
return ' 3 ';
} );
interface Human {
talk: () => void;
}
const human: Human = {
talk() { return 'abc'}
}
매개변수에서의 함수 형식 void와 return에서의 void 그리고 메서드에서의 함수형식 void 총 3가지 경우가 있다.
- 매개변수의 void는 return 값이 존재 해도 된다.
- 메서드에서의 void도 return 값이 존재 해도 된다.
- 함수의 return자리의 타입이 void인 경우만 직접적으로 return값을 적으면 안된다.
- 매개변수와 메서드의 void에서는 return값을 사용 할 수 있는 이유는 void는 return값을 사용하지 않겠다 이고, return 값의 void는 직접적으로 return값이 없다는 의미.
실질적인 예시
declare function forEach( arr: number[], callback: ( el: number ) => void ) : void;
let target: number[] = [];
forEach([1,2,3], el => target.push(el));
- callback 매개변수에서 void를 지정 해놨는데 target.push에서 number임에도 불구하고 가능한 이유는 매개변수의 void는 실제 return값이 뭐든 상관 없다.void가 undfined랑 다르다.
- declare는 외부에서 forEach함수를 선언했다. 그래서 여기서는 타입만 선언 했다. 보증함.