2017-04-26 5 views
5

Mamy następujące klasy TestComponent.ts maszynopis:„nowe” wyrażenie, którego cel brakuje podpisu konstruktu w maszynopisie

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: } 

A po TestVectorLayer.ts funkcja:

Należy pamiętać, że openlayers na 3 używa Google Closure Library, dlatego TestVectorLayer nie jest klasą TypeScript.

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; 

Dostajemy następujący błąd:

Error on Line 08 in TestComponent.ts class: 

[ts] 'new' expression, whose target lacks a construct signature, implicitly has an 'any' type. import TestVectorLayer

W package.json wersje maszynopisu:

devDependencies:

"typescript": "~2.2.1" 
+0

Zapomniałeś domyślny eksport TestVectorLayer? –

+1

@AluanHaddad Zrobiłem to w moim pytaniu, ale nie w kodzie. Zaktualizowałem to pytanie, dziękuję! Niezależnie od tego nadal otrzymuję błąd. – fuzz

+0

Dlaczego chcesz "nowe" tej funkcji? Pytam, ponieważ, mimo że istnieje łatwa korekta, która tłumi błąd, może to wskazywać na prosty sposób, w jaki można ulepszyć swój projekt. –

Odpowiedz

8

Oto uproszczenie poszukiwań jonowy:

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

const layer = new TestVectorLayer(""); 

Błąd dzieje ponieważ TestVectorLayer nie posiada nowy podpis, więc layer jest niejawnie wpisane jako any. Te błędy z --noImplicitAny.

Możesz to naprawić, przełączając się na zajęcia, ale w twoim przypadku wydaje się to nieco bardziej skomplikowane, ponieważ dziedziczenie jest wykonywane przez podstawowy szkielet. W związku z tym, trzeba będzie zrobić coś nieco bardziej skomplikowany i nie jest idealny:

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; 

Następnie w pliku z TestComponent:

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

Twoje bardziej skomplikowane, ale nie idealne rozwiązanie działa. :) Dzięki za dostarczenie tymczasowej poprawki. Spróbujemy przejść na klasę. Pierwotnie przeszliśmy na klasę i znaleźliśmy wiele problemów związanych z dziedziczeniem, dlatego zdecydowaliśmy się na hybrydowe podejście do adnotacji JS i TS. – fuzz

+0

@fuzz bez problemu! Może być lepszy sposób ... po prostu nie mogę o tym myśleć. –