想象一下,我正在建立一个简单的模型,该模型描述(例如)查询的详细信息:
export class QueryModel {
filters: FilterModel[];
page: number;
pageLength: number;
sortField: string;
sortDirection: string;
}
sortDirection
含糊不清,没有必要。毕竟,API接受asc
或desc
,并且不允许其他字符串值。因此,最好只指定这两个值,但我不确定如何指定这样的属性,而打字稿文档并没有帮助。本质上,我想这样做:
export class QueryModel {
filters: FilterModel[];
page: number;
pageLength: number;
sortField: string;
sortDirection: 'asc' | 'desc';
}
当然,联合运算符只使用类型,而不是值。我可以从概念上尝试这样的事情:
export class asc {
direction = 'asc';
}
export class desc {
direction = 'desc';
}
export class QueryModel {
filters: FilterModel[];
page: number;
pageLength: number;
sortField: string;
sortDirection: asc | desc;
}
但是即使可以,我的模型结构也发生了变化(排序方向现在是model.sortDirection.direction
而不是model.sortDirection
)
我是否有一个显而易见的选择?
答案 0 :(得分:2)
您可以创建类型
Type sortDirection = 'asc' | 'desc';
并在您的班级中使用它
export class QueryModel {
filters: FilterModel[];
page: number;
pageLength: number;
sortField: string;
sortDirection: sortDirection = 'asc';
}
答案 1 :(得分:2)
您可以使用联合值定义“文字类型”。
export type SortDirection = 'asc' | 'desc';
并在模型中使用它:
export class QueryModel {
filters: FilterModel[];
page: number;
pageLength: number;
sortField: string;
sortDirection: SortDirection;
}
答案 2 :(得分:1)
正如其他人提到的那样,有多种方法可以满足您的要求。
首先,最简单的方法是按照您的实际建议进行操作
export class QueryModel {
filters: FilterModel[];
page: number;
pageLength: number;
sortField: string;
sortDirection: 'asc' | 'desc';
}
第二个是声明一个类型,然后使用它。这可能对可重用性有益
export type SortDirection = 'asc' | 'desc';
export class QueryModel {
filters: FilterModel[];
page: number;
pageLength: number;
sortField: string;
sortDirection: SortDirection;
}
第三个选项是定义一个枚举。除了可重用性之外,使用枚举还可以使代码更具可维护性。例如,在将来需要更改值asc
和desc
的情况下,您只需要更改枚举的值即可(而不是像所有情况那样遍历所有位置)类型定义。)
export enum SortDirection {
ASC = 'asc',
DESC = 'desc'
}
export class QueryModel {
filters: FilterModel[];
page: number;
pageLength: number;
sortField: string;
sortDirection: SortDirection;
}