2017-05-12 8 views
0

私はxlsxライブラリの型を改善するために取り組んでいます。私は、次の定義があります。しかし、IWorkSheetの特定のキーがIWorkSheetCellされていないメタデータのために使用されているオブジェクトの特定のキーの値のタイプをオーバーライドするにはどうすればよいですか?

export interface IWorkSheet { 
    [cell: string]: IWorkSheetCell; 
} 

を。例えば、!mergesは、代わりにIRangeの配列です。 「IWorkSheetCellを型に代入できません型 『IRange[]』のプロパティ 『['!merges']』。」

export interface IWorkSheet { 
    [cell: string]: IWorkSheetCell; 
    ['!merges']?: IRange[]; 
} 

残念ながら、これはエラーになり:従って私は次のように定義してみてください私はこれを代わりにIWorkSheetCell | anyと宣言することで回避できますが、これはオートコンプリートを破り、宣言の意図を反映しません。

オブジェクトのデフォルト値の型を宣言し、特定のキーに対してオーバーライドするにはどうすればよいですか?

答えて

3

あなたはinterfaceでこれを行うが、intersection typeとすることはできません。

type IWorkSheet = { 
    [cell: string]: IWorkSheetCell; 
} & { 
    ['!merges']?: IRange[]; 
} 

または:このについての詳細は、インターフェイス上で実行可能なされていないために

interface IWorkSheet { 
    [cell: string]: IWorkSheetCell; 
} 

type IWorkSheetMerges = IWorkSheet & { ['!merges']?: IRange[]; } 
+2

は、[角度を参照してください。 d.ts](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/angular/index.d.ts#L349)と関連する[github issue](https://github.com/Microsoft/TypeScript/issues/272) – Paarth

+0

インターフェイスとオブジェクトタイプの実際的な違いは何ですか@Paarthがリンクすると、Typescriptが "それを保つことはできないと約束する"ことができるということを指摘しています。それは、何を期待するかを考え出すのにはかなり良いようですが、 '!merges'と答えることができ、まったく異なる型を返すことができても、' worksheet [prompt( 'cell?')] 'IWorkSheetCellを仮定します。 – Wolfgang

+1

正直なところ、私は 'type'ではこれを許しているが、' interface'では許可していないという理由はありません。あなたの例では、 'prompt()'はstringを返すので、 'worksheet [prompt()]'で文字列インデックスを参照します。 'prompt()' *は文字列 '"!merges "を返すことができますが、TSがコンパイル時にこれを知る方法はないので、return * type *は単に' string'です。 'prompt()'は任意の文字列(またはnull)を返すことができます。 – Aaron

関連する問題