我有一个第三方打字稿定义文件(JayData):
declare module MyEntities
{
export class Container extends $data.EntityContext
{
public onReady(): $data.IPromise<any>;
public onReady(handler: (context: Container) => void): $data.IPromise<any>;
public Users: $data.EntitySet<Models.UserModel>;
}
}
但是一个有效的Javascript是如何初始化MyEntities类:
var db = new MyEntities({ name: 'local', databaseName: 'MyDb' });
但是对于 TS 来说,这没有意义,MyEntities
是一个模块而不是一个类,因此抛出编译错误:Cannot invoke an expression whose type lacks a call signature
.
有什么办法可以忽略这个编译错误吗?
有什么办法可以忽略这个编译错误吗?
丑陋的修复使用类型断言:
declare module $data{
export class EntityContext{}
export class IPromise<T>{}
export class EntitySet<T>{}
}
declare module Models{export class UserModel{}}
declare module MyEntities
{
export class Container extends $data.EntityContext
{
public onReady(): $data.IPromise<any>;
public onReady(handler: (context: Container) => void): $data.IPromise<any>;
public Users: $data.EntitySet<Models.UserModel>;
}
}
var db = new ((<any>MyEntities)({ name: 'local', databaseName: 'MyDb' }));
正确修复
您的类型定义有很多错误。您需要查看 TypeScript interface
的强大功能。下面是一个入门示例:
interface Container{
onReady():any;
}
interface ContainerStatic{
new ():Container;
}
declare var MyEntities:
{
// A constructor signature
new (options:any):any;
// Sub classes
Container:ContainerStatic;
}
var db = new MyEntities({ name: 'local', databaseName: 'MyDb' });
var container = new MyEntities.Container();
如果正确修复错误或使用已经建议的更体面的解决方法不是一种选择,从 TypeScript 2.6(2017 年 10 月 31 日发布)开始,现在有一种方法可以使用目标行之前的// @ts-ignore
注释忽略特定行中的所有错误。
修补后的文档足够简洁,但回顾一下:
// @ts-ignore
const s : string = false
禁用此行的错误报告。
但是,这应该只在修复错误或使用像(x as any)
这样的黑客时用作最后的手段,这比丢失一行的所有类型检查要麻烦得多。
年中期)状态在这里讨论,在设计会议说明(2/16/2018)和进一步的评论中,基本上是
"还没有结论"
并强烈反对引入这种微调。
当您处理自动生成的定义时,您可能会发现此技巧很有用。
您可以使用模块合并来解决问题,而无需编辑自动生成的文件。
首先包含此定义文件,它将合并到自动生成的文件中以创建合并的"类模块"。(对于定义文件,顺序并不像尝试在实际实现代码中使用模块合并那样重要)。
myextension.d.ts
declare class MyEntities {
constructor(options: { name: string; databaseName: string; })
}
两个声明必须具有相同的公共根(这将导致它们合并),但是查看您问题中的定义,它似乎对您有用。