javascript - 打字稿:具有“n”次具有动态名称的属性
问题描述
我有一个类,我想对其进行类型检查,这
是它的代码:
class FlightFilter implements Filter {
get filters() {
return {
departTime: { name: 'زمان رفت', type: FilterTypes.Range },
price: { name: 'بازه قیمتی', type: FilterTypes.Range },
flightType: { name: 'نوع پرواز', type: FilterTypes.CheckboxList },
flightClass: { name: 'کلاس پروازی', type: FilterTypes.CheckboxList },
airline: { name: 'شرکت هواپیمایی', type: FilterTypes.CheckboxList },
airports: { name: 'فرودگاه ها', type: FilterTypes.CheckboxList }
};
}
fillData() {
for (const filter of this.filters) {
console.log(filter);
}
}
departTime(ticket) {
return true;
}
departTimeDataGenerator() {}
departTimeModel = null;
price(ticket) {
return true;
}
priceDataGenerator() {}
priceModel = null;
flightType(ticket) {
return true;
}
flightTypeDataGenerator() {}
flightTypeModel = null;
flightClass(ticket) {
return true;
}
flightClassDataGenerator() {}
flightClassModel = null;
airline(ticket) {
return true;
}
airlineDataGenerator() {}
airlineModel = null;
airports(ticket) {
return true;
}
airportsDataGenerator() {}
airportsModel = null;
}
我试图为它创建一个接口,但我不知道如何拥有“n”次具有动态名称的属性,
如下所示:
interface Filter {
filters(): Object;
fillData(): void;
// Here is the part that i want multiple of
[name: String](ticket: Object): Boolean;
[name: String]DataGenerator(): void;
[name: String]Model: any
}
请记住,我的javascript项目中有上述代码,我想切换到打字稿
解决方案
感谢打字稿不和谐社区中的“BobobUnicorn”,我现在有一个答案
,这太棒了!
type Filter<T extends { filters: unknown }> = {
filters: T['filters'];
fillData(): void;
} & {
[K in keyof T['filters']]: (ticket: unknown) => boolean;
} & {
[K in keyof T['filters']as `${K & string}DataGenerator`]: () => void;
} & {
[K in keyof T['filters']as `${K & string}Model`]: any;
}
enum FilterTypes {
Range = 1,
CheckboxList = 2
}
class FlightFilter implements Filter<FlightFilter> {
get filters() {
return {
departTime: { name: 'زمان رفت', type: FilterTypes.Range },
price: { name: 'بازه قیمتی', type: FilterTypes.Range },
flightType: { name: 'نوع پرواز', type: FilterTypes.CheckboxList },
flightClass: { name: 'کلاس پروازی', type: FilterTypes.CheckboxList },
airline: { name: 'شرکت هواپیمایی', type: FilterTypes.CheckboxList },
};
}
fillData() {
// for (const filter of this.filters) {
// console.log(filter);
// }
}
departTime(ticket: any) {
return true;
}
departTimeDataGenerator() { }
departTimeModel = null;
price(ticket: any) {
return true;
}
priceDataGenerator() { }
priceModel = null;
flightType(ticket: any) {
return true;
}
flightTypeDataGenerator() { }
flightTypeModel = null;
flightClass(ticket: any) {
return true;
}
flightClassDataGenerator() { }
flightClassModel = null;
airline(ticket: any) {
return true;
}
airlineDataGenerator() { }
airlineModel = null;
}
推荐阅读
- bash - 从 bash shell 运行“git filter-branch”
- django - 数据未填写编辑配置文件表单 Django
- android - 尝试将 firebaseml vision 和 firebase core/auth 集成到颤振中时,应用程序停止工作
- python - 如何比较具有相同列但行数不同的两个数据框?
- python - 在 VS Code 终端中显示经过的时间
- json - 如何将嵌套的 JSON 文件解码为具有无主属性的 swift 类
- android - JUnit 本地测试 - Android 上下文“未注册仪器!”
- ruby - if/elsif 数能被 3 整除
- c# - Unity 每次点击都会增加 90º
- java - 如何解决此错误:找不到符号类 DragAdapter