'new'表达式,其目标在TypeScript中缺少构造签名

时间:2017-04-26 01:23:26

标签: javascript typescript

我们有以下TestComponent.ts TypeScript类:

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

以下TestVectorLayer.ts功能:

请记住,OpenLayer 3正在使用Google Closure库,这就是TestVectorLayer不是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; 

我们收到以下错误:

Error on Line 08 in TestComponent.ts class:
  

[ts]'new'表达式,其目标缺少构造签名,隐式具有“any”类型。       导入TestVectorLayer

TypeScript的package.json版本:

devDependencies:

"typescript": "~2.2.1"

3 个答案:

答案 0 :(得分:15)

以下是问题的简化:

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

const layer = new TestVectorLayer("");

发生错误是因为TestVectorLayer没有新签名,因此layer被隐式输入为any。错误--noImplicitAny

您可以通过切换到类来解决此问题,但在您的情况下,这似乎有点复杂,因为继承是由底层框架完成的。因此,你必须做一些更复杂的事情并且它并不理想:

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; 

然后在TestComponent的文件中

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

答案 1 :(得分:6)

David的回答很好,但是如果您只是想快速地使其编译(例如,因为您正在从JS迁移到TS),那么您可以简单地将staff放在此处以关闭抱怨的编译器。

TS文件:

any

编译为此JS文件:

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

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

只需注意不要犯此错误:

TS文件:

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

JS结果:

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

这是错误。您会在运行时收到// wrong! var test2 = new (TestConstructor(1, 2)); 错误。

答案 2 :(得分:0)

例如,就我而言,您必须将其定义为 any 并具有 new 签名。

const dummyCtx = function(txt: string) {
  this.foo = txt
} as any as { new (txt: string): any }

// just use it as usual
const dctx = new dummyCtx('bar')