联盟和交叉点类型的操作顺序?

时间:2017-03-26 15:47:26

标签: typescript

我有一个类型场景,我想说:

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 个答案:

答案 0 :(得分:1)

您可以使用界面。

基本架构的一个接口:

interface Schema { readOnly?: boolean };

然后是扩展它的其他人:

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