我有一个这样的对象:
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,
}
}
属性。
有些想法?我该怎么办?
答案 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
}
}