어떤 타입이 올 지 미리 알 수 없는 상황에서 해당 타입부분을 실행할 때 타입을 받도록 여지를 남겨두는 것입니다.
function checkNotNull<T>(arg: T | null): T {
if (arg == null) {
throw new Error('not valid number!');
}
return arg;
}
class SimpleEither<L, R> implements Either<L, R> {
constructor(private leftValue: L, private rightValue: R) {}
left(): L {
return this.leftValue;
}
right(): R {
return this.rightValue;
}
}
const either: Either<number, number> = new SimpleEither(4, 5);
either.left(); // 4
either.right(); //5
어떤 타입이 올 지 알 수 없다고 해도, any처럼 사용되지 않기 위해서 제약을 걸 수 있는 부분은 제약을 걸 수도 있습니다.
타입을 좀 더 구체적으로 정할수록 좋습니다.
const obj = {
name: 'ellie',
age: 20,
};
const obj2 = {
animal: '🐕',
};
console.log(getValue(obj, 'name')); // ellie
console.log(getValue(obj, 'age')); // 20
console.log(getValue(obj2, 'animal')); // 🐕
function getValue<T, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key];
}