生成指定属性允许值的angular / typescript类

时间:2019-05-29 13:09:59

标签: angular typescript

想象一下,我正在建立一个简单的模型,该模型描述(例如)查询的详细信息:

export class QueryModel {
    filters: FilterModel[];
    page: number;
    pageLength: number;
    sortField: string;
    sortDirection: string;
}

sortDirection含糊不清,没有必要。毕竟,API接受ascdesc,并且不允许其他字符串值。因此,最好只指定这两个值,但我不确定如何指定这样的属性,而打字稿文档并没有帮助。本质上,我想这样做:

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

我是否有一个显而易见的选择?

3 个答案:

答案 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;
}

第三个选项是定义一个枚举。除了可重用性之外,使用枚举还可以使代码更具可维护性。例如,在将来需要更改值ascdesc的情况下,您只需要更改枚举的值即可(而不是像所有情况那样遍历所有位置)类型定义。)

export enum SortDirection {
    ASC = 'asc',
    DESC = 'desc'
}

export class QueryModel {
    filters: FilterModel[];
    page: number;
    pageLength: number;
    sortField: string;
    sortDirection: SortDirection;
}