我有一个类型场景,我想说:
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或其他任何内容。
答案 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;
}