programing

생성자가 서명 new와 일치하지 않습니다.

starjava 2023. 6. 16. 21:17
반응형

생성자가 서명 new와 일치하지 않습니다.

이 경우 "컴파일" 문제가 있습니다.

interface IDataObjectConstructor {
    new (objJSON?: any): myDataObject;
}

class myDataObject implements IDataObjectConstructor {
    constructor(objJSON: any = null) {
        for (var prop in objJSON) {
            this[prop] = objJSON[prop];
        }
    }
}

다음과 같이 표시됩니다.

클래스 'myDataObject'가 인터페이스 '를 잘못 구현함IDataObjectCurrent'입니다.

'myDataObject' 유형은 'new(obJJSON?: any): myDataObject' 서명과 일치하는 항목을 제공하지 않습니다.

마지막으로 이 개체를 다음과 같이 사용합니다.

class viewModelList<T extends myDataObject>{
    item: T;
    constructor(itemType: T) { this.item = itemType; }

    itemBuilder(json?) { return new this.item(json); }
}

class derivedDataObject extends myDataObject{
    constructor(objJSON: any = null) { super(objJSON); }
}

class derivedViewModelList extends viewModelList<derivedDataObject>{

    constructor() { super(derivedDataObject); }
}

let oManager = new derivedViewModelList();

클래스의 정적 측과 인스턴스 측의 차이

클래스와 인터페이스를 사용할 때 클래스에는 정적 측 유형과 인스턴스 측 유형의 두 가지 유형이 있습니다.구성 서명이 있는 인터페이스를 만들고 이 인터페이스를 구현하는 클래스를 만들려고 하면 다음 오류가 발생할 수 있습니다.

interface ClockConstructor {
    new (hour: number, minute: number);
}

class Clock implements ClockConstructor { // error
    constructor(h: number, m: number) { } 
}

클래스가 인터페이스를 구현할 클래스의 인스턴스 쪽만 확인하기 때문입니다.생성자는 정적 측에 있으므로 이 검사에는 포함되지 않습니다.

대신, 당신은 수업의 정적인 측면과 직접적으로 협력해야 할 것입니다.이 예에서는 생성자를 위한 ClockConstructor인스턴스 메서드를 위한 ClockInterface라는 두 가지 인터페이스를 정의합니다.그런 다음 편의를 위해 전달되는 유형의 인스턴스를 만드는 생성자 함수 createClock을 정의합니다.

interface ClockConstructor {
    new (hour: number, minute: number): ClockInterface;
}
interface ClockInterface {
    tick();
}

function createClock(ctor: ClockConstructor, hour: number, minute: number): ClockInterface {
    return new ctor(hour, minute);
}

class DigitalClock implements ClockInterface {
    constructor(h: number, m: number) { }
    tick() {
        console.log("beep beep");
    }
}
class AnalogClock implements ClockInterface {
    constructor(h: number, m: number) { }
    tick() {
        console.log("tick tock");
    }
}

let digital = createClock(DigitalClock, 12, 17);
let analog = createClock(AnalogClock, 7, 32);

왜냐면createClock의 첫 번째 매개 변수는 ClockConstructor 유형입니다.createClock(AnalogClock, 7, 32)AnalogClock에 올바른 생성자 서명이 있는지 확인합니다.

자세한 내용은 설명서를 참조하십시오.

자동으로 발생하는 생성자 인터페이스를 구현하기 위해 클래스가 필요하지 않습니다.

예:

interface IDataObjectConstructor {
    new (objJSON?: any): myDataObject;
}

class myDataObject {
    constructor(objJSON: any = null) {
        for (var prop in objJSON) {
            this[prop] = objJSON[prop];
        }
    }
}

function factory(ctor: IDataObjectConstructor) {
    return new ctor();
}

let o = factory(myDataObject);

(플레이그라운드의 코드)

factory함수는 다음을 기대합니다.IDataObjectConstructor그리고 우리는 수업 자체를 통과하고 있고 당신의 수업이 그것을 구현한다고 선언되지 않았음에도 불구하고 당신은 어떠한 컴파일 오류도 얻지 못합니다.

언급URL : https://stackoverflow.com/questions/37654840/constructor-provides-no-match-for-signature-new

반응형