2017-03-26 24 views
0

我有,我想說一個類型的場景:聯合和相交類型的操作順序?

export interface ItemSchema { 
    [attrName: string]: 
    { type: 'number', default?: number, readOnly?: boolean} | 
    { type: 'string', default?: string, readOnly?: boolean} | 
    { type: 'boolean', default?: boolean, readOnly?: boolean} | 
    { type: 'date', default?: Date, readOnly?: boolean} | 
    { type: 'object', default?: object, readOnly?: boolean} 
} 

(因爲我是定義模式,對數據得到JSON格式,FWIW各地通過在運行時是可用的,這就是接口爲模式)。

這很方便,因爲在我的實際類型定義中可以有{ type: 'number', default: 2 }而不是{ type: 'number', default: 'potato' }

我想拉出readOnly位(和其他的東西在這裏爲簡單起見省略)到一個單獨的部分。我其實可以{ readOnly?: boolean } &加上上面的堆棧,它似乎可以工作,但這取決於這些操作的順序。和沒有充分記錄的運營商(至少不在我能找到的地方)。 (括號內,我也可以使用圓括號,看起來像{} & ({} | {} | {}),但是這使得我的棉絨發狂,所以我不確定是否在這裏正式支持圓括號或者它只是一個意外)。

那麼,有沒有一個地方的操作順序定義爲這些界面組成操作?我不想編寫代碼,因爲編譯器中沒有記載的怪癖而運行,並讓它在2.3中破解或者其他。

回答

1

您可以使用接口。對於基礎架構

一個接口:

interface NumberSchema extends Schema { type: 'number', default?: number }; 
interface BooleanSchema extends Schema { type: 'boolean', default?: boolean }; 
interface StringSchema extends Schema { type: 'string', default?: string }; 
interface DateSchema extends Schema { type: 'date', default?: Date }; 
interface ObjectSchema extends Schema { type: 'object', default?: object }; 

然後,地圖爲:

interface ItemSchema { 
    [attrName: string]: NumberSchema | BooleanSchema | StringSchema | DateSchema | ObjectSchema; 
} 

code in playground

interface Schema { readOnly?: boolean }; 

然後誰擴展它的人