javascript - 'new'-uttrykk, hvis mål mangler en konstruksjonssignatur i TypeScript


Vi har følgende TestComponent.ts TypeScript-klasse:

01: import TestVectorLayer from './TestVectorLayer'
02: 
03: export class TestComponent implements OnInit {
04:   private foo: any;
05: 
06:   constructor() { }
07: 
08:   const layer = new TestVectorLayer("foo");
09: }

Og den følgende TestVectorLayer.ts-funksjonen:

Husk at OpenLayer 3 bruker Google Closure Library, derfor er ikke TestVectorLayer en TypeScript-klasse.

01: declare let ol: any;
02:
03: const TestVectorLayer = function (layerName: string) {
04:   ...
05:   console.log(layerName);
06:
07:   ol.layer.Image.call(this, opts);
08: }
09:
10: ol.inherits(TestVectorLayer as any, ol.layer.Image as any);
11:
12: export default TestVectorLayer; 

Vi får følgende feil:

Error on Line 08 in TestComponent.ts class:

[ts] 'new'-uttrykk, hvis mål mangler en konstruktørsignatur, har implisitt typen 'any'. import TestVectorLayer

Versjonene av TypeScript i package.json:

utviklingsavhengigheter:

"typescript": "~2.2.1"

Svar #1

Davids svar er flott, men hvis du bare bryr deg om å få det til å kompilere raskt (for eksempel fordi du migrerer fra JS til TS), kan du ganske enkelt sette any der for å få den klagende kompilatoren til å tie.

TS-fil:

const TestConstructorFunction = function (this: any, a: any, b: any) {
    this.a = a;
    this.b = b;
};

let test1 = new (TestConstructorFunction as any)(1, 2);

kompilerer til denne JS-filen:

var TestConstructor = function (a, b) {
    this.a = a;
    this.b = b;
};
var test1 = new TestConstructor(1, 2);

Bare pass på å ikke gjøre denne feilen:

TS-fil:

// wrong!
let test2 = new (TestConstructorFunction(1, 2) as any);

JS-resultat:

// wrong!
var test2 = new (TestConstructor(1, 2));

og dette er feil. Du vil få TypeError: TestConstructor(...) er ikke en konstruktør-feil under kjøring.

Svar #2

Her er en forenkling av spørsmålet:

const TestVectorLayer = function(layerName: string) {
};

const layer = new TestVectorLayer("");

Feilen oppstår fordi TestVectorLayer ikke har en ny signatur, så layer blir implisitt typet som any. Det gir feil med --noImplicitAny.

Du kan fikse dette ved å bytte til en klasse, men i ditt tilfelle virker dette litt mer komplisert fordi arven gjøres av det underliggende rammeverket. På grunn av det må du gjøre noe litt mer komplisert, og det er ikke ideelt:

interface TestVectorLayer {
  // members of your "class" go here
}

const TestVectorLayer = function (this: TestVectorLayer, layerName: string) {
  // ...
  console.log(layerName);
  ol.layer.Image.call(this, opts);
} as any as { new (layerName: string): TestVectorLayer; };

ol.inherits(TestVectorLayer, ol.layer.Image);

export default TestVectorLayer; 

Deretter i filen med TestComponent:

const layer = new TestVectorLayer(layerName); // no more compile error

Relaterte artikler