8

TypescriptでBackbone.Marionetteを使用しています。私はマリオネットの独自のタイプの説明を書きました。

var ProviderSpa = new Backbone.Marionette.Application();
ProviderSpa.addRegions({
    'servicesRegion': "#services-offered"
});
ProviderSpa.servicesRegion.show();

私の問題は、addRegionsには、TypeScriptが認識していないProviderSpaにプロパティを追加するという副作用があるため、「プロパティ」servicesRegion'がタイプ「Backbone.Marionette.Application」の値に存在しないという文句を言うことです。

タイプのインスタンスへのこれらの動的プロパティの追加についてTypeScriptにどのように伝えることができますか?

4

3 に答える 3

3

この例では、BackBone Marionette の縮小定義を使用しました。

多くの動的プロパティがオブジェクトに追加されている場合、それらすべての宣言またはインターフェイスを作成しようとするのではなく、物事を動的のままにしておくことをお勧めします。特に、新しいプロパティと利点で宣言を最新に保つオーバーヘッドとして実際に動的なプロパティに静的な型付けを行うことは、私が支払うコストではありません。

この例では、角括弧構文を使用してプロパティにアクセスすると、宣言を必要とせずに型チェックに合格することを意味します。重要な部分は最後の行にあります。

これはTypeScript のプレイグラウンドでテストできます。

declare module Backbone {
    export module Marionette {
        export class Application {
            addRegions(regions: any): void;
        }
    }
}

var servicesRegion = 'servicesRegion';
var ProviderSpa = new Backbone.Marionette.Application();
ProviderSpa.addRegions({
    servicesRegion: "#services-offered"
});
ProviderSpa[servicesRegion].show();
于 2012-10-26T08:24:25.217 に答える
0

TypeScript 型はコンパイル時にのみ存在するため、ランタイム効果は TypeScript 型システムでは考慮できません。コンパイル時に ProviderSpa を適切に入力する必要があります。おそらく最も簡単な方法は、addRegions と servicesRegion タイプを持つ ProviderSpa のインターフェースを作成することです。

interface IProviderSpa { servicesRegion: ...; addRegions: ...; };
var ProviderSpa = <IProviderSpa> new Backbone.Marionette.Application();

Marionette にアプリケーション用のインターフェイス タイプがある場合は、次のように拡張することもできます。

interface IProviderSpa extends Backbone.Marionette.IApplication { ... }
于 2012-10-25T19:19:58.760 に答える