2015-01-07 97 views
1

我有一個第三方的打字稿定義文件(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

有什麼辦法可以忽略這個編譯錯誤嗎?

回答

1

當你正在處理自動生成的定義,你可能會發現這個技巧很有用。

您可以使用模塊合併來解決您的問題,而無需編輯自動生成的文件。

首先包含此定義文件,它將合併到自動生成的文件中以創建合併的「類模塊」。 (對於定義文件,順序並不像您試圖在真正的實現代碼中使用模塊合併那樣重要)。

myextension.d.ts

declare class MyEntities { 
    constructor(options: { name: string; databaseName: string; }) 
} 

兩個聲明必須具有相同的共同的根(這是什麼會導致他們合併),但在你的問題的定義看,它看起來像它會爲工作您。

2

Is there any way around this to ignore this compile error?

UGLY修復使用TypeAssertion:

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(); 
+0

嗯謝謝我會看看這個。問題是我沒有太多的靈活性來改變定義文件,因爲它是基於OData web api控制器自動生成的。 – YesMan85