TypeScript,具有条件属性的通用类型

时间:2018-10-12 11:08:32

标签: javascript angular typescript

我有一个这样的对象:

import re
text ="12345678S00"
y=""

for i in range(0,len(text)):
    r=re.match('[a-zA-Z]',text[i])
    if r!=None:
        y+='s'
    r=re.match('[0-9]',text[i])
    if r!=None:
        y+='\d'
    r=re.match('[.,_=&*()%^@$!#-]',text[i])
    if r!=None:
        y+='\S'

\d\d\d\d\d\d\d\ds\d\d #output

这代表一些过滤器。 我有2个过滤器类型,一个过滤器可能需要一些额外的属性才能工作。 我想正确输入。 键入取决于filters: Filters = { type: { name: 'type', type: FilterType.checkbox, availableValues: [ { label: 'test 1', value: 1}, { label: 'test 2', value: 2} ] }, search: { name: 'search', type: FilterType.text, } } 属性。

有些想法?我该怎么办?

2 个答案:

答案 0 :(得分:0)

您可以使用索引签名(以允许/unix/path/中的任何键)和已区分的联合类型要求某些搜索类型需要额外的属性:

Filter

或者,如果要保留类型中的键并使用函数,也可以这样编写:

type Filters = {
    [key: string]: {
        name: string,
        type: FilterType.checkbox,
        availableValues: Array<{
            label: string,
            value: number
        }>
    } | {
        name: string,
        type: FilterType.text,
    }
}

enum FilterType {
    checkbox,
    text
}
var filters: Filters = {
    type: {
        name: 'type',
        type: FilterType.checkbox,
        availableValues: [
            { label: 'test 1', value: 1 },
            { label: 'test 2', value: 2 }
        ]
    },
    search: {
        name: 'search',
        type: FilterType.text,
    }
}

注意:映射类型type Filters = { [key: string]: { name: string, type: FilterType.checkbox, availableValues: Array<{ label: string, value: number }> } | { name: string, type: FilterType.text, } } enum FilterType { checkbox, text } function createFilter<T extends Filters>(p: T & { [P in keyof T]: { name : P }}) : T{ return p } var filters = createFilter({ type: { name: 'type', type: FilterType.checkbox, availableValues: [ { label: 'test 1', value: 1 }, { label: 'test 2', value: 2 } ] }, search: { name: 'search', type: FilterType.text, } }); 将强制执行{ [P in keyof T]: { name : P }}与对象分配给name相同的事实。不知道这是否需要,但似乎是预期的用法。

答案 1 :(得分:0)

我认为您正在尝试在此处封装过滤器类型和逻辑。我猜测以下方法可能有用,这样您就可以使用通用接口,并且可以对所有输入调用apply()方法。尽管我不知道它的用例。

export interface InputFilter {
  type: FilterType;
  apply: () => boolean;
}

export class CheckboxInputFilter implements InputFilter {
  type = FilterType.checkbox;
  availableValues: { label: string, value: number }[];

  apply(itemThatNeedFilter: any): boolean {
    // use this.availableValues and work out the instance filter result
  }
}

export class TextInputFilter implements InputFilter {
  type = FilterType.text;
  keyword: string;

  apply(itemThatNeedFilter: any): boolean {
    // use this.keyword and work out the instance filter result
  }
}