• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

Generic in Function 강의 instantiator 질문입니다.

23.07.31 00:06 작성 조회수 271

0

Generic in Function (함수에서 제너릭 사용하기) 강의 내용에서의 질문입니다.

class Car {
    brand: string;
    codeName: string;

    constructor(brand: string, codeName: string) {
        this.brand = brand;
        this.codeName = codeName;
    }
}

function instantiator<T extends { new(...args: any[]): {} }>(classObject: T,
    ...args: any[]) {
    return new classObject(...args);
}

console.log(instantiator(Car, 'BMW', 1111));

Car의 경우 생성자의 codeName 인자의 타입이 string인데

...args의 타입을 any[]로 지정했기 때문에

instantiator(Car, 'BMW', 1111)에서 codeName에 number값을 넣어도 오류가 발생하지 않았습니다.

물론 단순히 할당하기만 하는 코드이기 때문에 런타임에서도 오류가 발생하지는 않을 것 입니다.

좀 더 정확한 타입 체킹을 할 수 있도록 위 케이스에서 클래스 생성자의 인자 타입까지 반영해서 체크하는 instantiator를 작성할 수 있을까요?

답변 1

답변을 작성해보세요.

0

안녕하세요!

아래처럼 말씀이실까요?

image

감사합니다!

서민종님의 프로필

서민종

2024.03.15

안녕하세요 저도 비슷한 문제로 고민하고 있었는데요

인자값도 인자값인데 결과값을 사용하려고 할 때 어떻게 해야될 지 고민중이라 질문드립니다.

function instantiator<T extends {new (...args: any[]) : {}}>(constructor: T, ...args: any[]){
    return new constructor(...args);
}

function instantiator2<T extends {new (...args: any[]) : {name:any, age:any}}>(constructor: T, ...args: any[]){
    return new constructor(...args);
}

const idol1 = instantiator2(Idol,'name', 19);
const car1 = instantiator(Car,'name', '19');
console.log(idol1);
console.log(idol1.age);
console.log(idol1.name);
console.log(car1);

이런 식으로 결과값 오브젝트에 직접 파라미터를 박아주면 값을 사용할 수 있었긴 했는데 이러면 제너릭을 사용하는 의미를 못 느끼겠어서 해결할 방법이 있는지 궁금해요.

제너릭을 사용하는 의미를 못느낀다는게 어떤 말씀이신지 잘 모르겠습니다. 제너릭을 사용할때 제너릭에 해당되는 정의는 어디서든 정의를 해둬야합니다. {name:any, age:any} 타입을 상속받는 타입을 {name:any, age:any} 정의 없이 사용하는 방법은 존재하지 않습니다. 민종님이 생각하는 '제너릭이 의미 있어지는' 경우를 예제로 작성 해주세요.