2016-10-25 9 views
1

JavaScriptプロジェクトをTypeScriptに移行しています。タイプ '{}' 'ストリング'タイプを避けてください '{}'をタイプ 'X'に割り当てることはできません

を入力する割り当て可能でない

:で

import nodeUrl = require('url'); 
// ... 
// this worked fine in JS 
nodeUrl.format({ 
    // just for demonstration 
    x: this.getX(someObj), 
    y: this.getY(someObj) 
}); 

結果:例えばURLとしてTSのノードモジュールは、私のためにいくつかの問題を引き起こしている使用

これは、そのモジュール機能の定義によるものです。 タイプ/ノード/ index.d.ts @から:

declare module "url" { 
    export interface Url { 
     href?: string; 
     protocol?: string; 
     auth?: string; 
     hostname?: string; 
     port?: string; 
     host?: string; 
     pathname?: string; 
     search?: string; 
     query?: string | any; 
     slashes?: boolean; 
     hash?: string; 
     path?: string; 
    } 

    export function parse(urlStr: string, parseQueryString?: boolean, slashesDenoteHost?: boolean): Url; 
    export function format(url: Url): string; 
    export function resolve(from: string, to: string): string; 
} 

私の質問はどのようにこのエラーが宣言ファイルを変更することなく、修正/回避しないのですか?これについての詳細情報はModule Augmentationで見つけることができます

import nodeUrl = require('url'); 

declare module "url" { 
    export function format(url: Url): string; 
    export function format(x: any, y: any): string; 
    export function format(url: any): string; 
} 

+0

あなたがする何をしようとしているが、それはとても 'format'は、任意のキーを受け入れるだろう作りますか?私はこれに答えることができるかもしれません。 –

+0

私はJSONオブジェクトを 'Url'オブジェクトを期待する' format'メソッドに渡すという事実をコンパイラが無視するようにしたいと思います。または、私のJSONを 'Url'オブジェクトに変換する方法(どのアプローチがより洗練されているかによります)。 – lenny

答えて

1

は次のようなものであるべき。まだ文字列のキーと値を持つオブジェクトが必要formatよう

export function format(url: {[index: string]: string}): string 

これはそれを行いますが、キーの名前は、何もすることができます:

+0

それが正しいとすれば、これは既存の宣言を「上書きする」でしょうか? – lenny

+0

これを上書きしないでください。あなたは既存の定義を維持したいが、それに追加する –

0

あなたはインデックスの署名を使用することができます。もちろん、あなたのニーズに合わせてタイプを混ぜ合わせることができます。それを修正するための別の方法を見つけた

0

nodeUrl.format(<any> { 
    // just for demonstration 
    x: this.getX(someObj), 
    y: this.getY(someObj) 
}); 
+0

しかし、あなたは型の安全性を失う。 –

+0

私はあなたのアプローチでも、とにかく私がそれを受け入れることができるだろう。 – lenny

+0

私のアプローチでは、特定のタイプに合ったシグネチャを追加する(実際の実装に合わせる必要がある)ということです。 'any'を使わないでください。署名を追加できることを示すために使用しました。 –

関連する問題