2017-11-21 34 views
0

を拡張します私は後で他の場所で自分のコードにアクセスできます)。は、私は次のエラーを取得していますtypescriptですdefinitelyTyped定義ファイル

私がしたいことは、model.hasMany interface hereを拡張し、自分の鍵を追加することです。これは可能ですか?もしそうなら、どうすればいいですか?

現時点での回避策は、オブジェクトを渡す前にオブジェクトを<any>にキャストすることです。これは、問題の回避策のようです。

私は次のことを試みた:

import Sequelize from 'sequelize'; 

export declare module Sequelize { 
    export interface MyAssociationOptionsHasMany extends Sequelize.AssociationOptionsHasMany { 
     gql?: any 
    } 
    export interface MyAssociations extends Sequelize.Associations { 
     hasMany(target: Sequelize.Model<any, any>, options?: MyAssociationOptionsHasMany): void; 
    } 
} 

そして今、私は次のエラーを取得する:

TypeError: Cannot read property '239' of undefined 
    at getDeclarationSpaces (C:\Users\user\AppData\Roaming\npm\node_modules\typescript\lib\tsc.js:33121:54) 
    at checkExportsOnMergedDeclarations (C:\Users\user\AppData\Roaming\npm\node_modules\typescript\lib\tsc.js:33067:41) 
    at checkModuleDeclaration (C:\Users\user\AppData\Roaming\npm\node_modules\typescript\lib\tsc.js:35036:17) 
    at checkSourceElement (C:\Users\user\AppData\Roaming\npm\node_modules\typescript\lib\tsc.js:35505:28) 
    at Object.forEach (C:\Users\user\AppData\Roaming\npm\node_modules\typescript\lib\tsc.js:275:30) 
    at checkSourceFileWorker (C:\Users\user\AppData\Roaming\npm\node_modules\typescript\lib\tsc.js:35566:20) 
    at checkSourceFile (C:\Users\user\AppData\Roaming\npm\node_modules\typescript\lib\tsc.js:35551:13) 
    at getDiagnosticsWorker (C:\Users\user\AppData\Roaming\npm\node_modules\typescript\lib\tsc.js:35604:17) 
    at Object.getDiagnostics (C:\Users\user\AppData\Roaming\npm\node_modules\typescript\lib\tsc.js:35593:24) 
    at C:\Users\user\AppData\Roaming\npm\node_modules\typescript\lib\tsc.js:56188:85 
+0

https://github.com/DefinitelyTyped/DefinitelyTyped#how-can-i-contribute –

+0

@Mörreこれは私のアプリケーション専用に作成したプロパティであり、 )、その変更をリポジトリにコミットするのは間違いです。 – FrankerZ

+0

Typescriptは[宣言のマージ](https://www.typescriptlang.org/docs/handbook/declaration-merging.html)を使用しているため、独自の定義ファイルをインターフェイスに追加して作成することができます。 –

答えて

1

あなたはDeclaration Merging経由でこれを行うことができます。私がこれがうまく動作することがわかった最良の方法は、ライブラリを「拡張子」ファイルにインポートし、そこからライブラリを拡張することです。例えば、

extensions/library-name.extension.ts:上記の例で

import AssociationOptionsHasMany from '/path/to/definition'; 
import 'library-name'; 

declare module 'library-name' { 
    interface InterfaceToExtend { 
    hasMany(options: AssociationOptionsHasMany): ReturnType; 
    } 
} 

、我々はlibrary-nameモジュールで作成されたインタフェースを拡張したいです。インポートを使用しているので、TypeScriptはファイルのモジュールを自動的に作成するので、このファイル用に作成されたモジュールではなく、library-nameモジュールでインターフェイスを拡張するようにTypeScriptに指示する必要があります。これを行うには、モジュールdeclareが、インポートしたライブラリと同じ名前を使用するだけです。

モジュールをインターフェイスで拡張する必要があることをTypeScriptに伝えたら、拡張するインターフェイスと同じ名前のインターフェイスを定義し、必要なものを追加するだけで宣言のマージを使用します。この場合、これは、渡す特定の型を引数として取る新しいメソッドになります。

また、tsconfig.jsonファイルを更新して、拡張機能を最初にロードする必要がありました。あなたは崇高を使用している場合、それはまだ文句を言うが、実際にコードをコンパイルするか、崇高の外に出て行くと、それが思わ再開可能性がある

{ 
    /* Blah, settings, blah */ 
    includes: ['./app/extensions/*.ts', './app/**/*.ts'], 
    /* Blah, settings, blah */ 
} 

:あなたはそのアプリの残りの部分の前にextensionsディレクトリを含めることによって行うことができますうまく動作します。

警告の言葉。宣言マージは強力ですが、予期しない動作が発生する可能性があります。一般的に、あなた(または他の人)が他の場所で定義したコンポーネントを拡張しないようにしてください。これらのコンポーネントを間違って使用しているか、リファクタリングが必要な場合があります。 TypeScriptの利点は厳密な型指定であることを覚えておいてください。

+0

私は遭遇している別の問題で質問を更新しました。 – FrankerZ

+0

@FrankerZ「export interface MyAssociationOptionsHasMany extends Sequelize.MyAssociationOptionsHasMany {/ * ... * /}」の代わりに 'export interface MyAssociationOptionsHasMany {/*...*/'と 'MyAssociations'に似たものを試してください。私はSequelizeにあまり慣れていないので、Sequelizeの詳細をあまりにも多く与えることはできません。 – c1moore

関連する問題