type A = {
readonly barA: string
};
const x: A = {barA: 'baz'};
x.barA = 'lalala'; // ⛔️ 변경 불가
const a : any[] = [1,2,3,4]
const b : any = true
a + b //허용됨
let valueNum: unknown = 10;
let valueStr: unknown = "unknown";
if (typeof valueNum === "number") {
console.log(valueNum.length);
}
if (typeof valueStr === "string") {
console.log(valueStr.length);
}
function a(x :number) :void {
return x * 2 //여기서 에러남
}
function hello () : never {
// return 'hi' <- 에러
throw new Error('~~')
}
type Add = (a:number, b:number) => number;
const add:Add = (a,b) => a + b
//const add:Add = (a,b) => {a + b} <- void가 됨
Function(=Method) Overloading은 직접 작성하기보다 외부 라이브러리에 자주 보이는 형태로, 하나의 함수가 복수의 Call Signature를 가질 때 발생한다
TypeScript에서는 오버로드 signatures을 작성하여 "다양한 방식으로 호출할 수 있는 함수"를 지정할 수 있다
매개변수의 데이터 타입이 다른 경우 예외 처리
type Add = {
(a: number, b: number): number,
(a: number, b: string): number
}
const add: Add = (a, b) => {
if (typeof b === "string") return a;
return a + b;
}
type Add2 = {
(a: number, b: number): number,
(a: number, b: number, c: number): number
}
const add2: Add2 = (a, b, c?: number) => {
if (c) return a + b + c;
return a + b;
}
위와 같은 함수는 거의 없지만 외부 라이브러리에서 활용될 수 있다
//Next.js 경우
router.push("/home");
router.push({
path: "/home",
state: 1
});
예를 들어, Next.js의 라우터 push가 대충 두 가지 방법으로 페이지를 이동한다고 할 때,
type Config = {
path: string,
state: number
}
type Push = {
(config: Config): void,
(config: string): void
}
const push: Push = (config) => {
if (typeof config === "string") console.log(config);
else console.log(config.path);
}
패키지나 라이브러리는 위와 같이 두 가지 경우의 Overloading으로 디자인되어 있을 것이다
출처 : https://velog.io/@ysong0504
https://yamoo9.gitbook.io/typescript/types/any
https://developer-talk.tistory.com/198
https://nomadcoders.co/typescript-for-beginners