简体   繁体   English

打字稿:具有“n”次具有动态名称的属性

[英]Typescript: having “n” times of a property with dynamic name

I have a class that i want to have type checking on it我有一个课程,我想对其进行类型检查
here is the code for it:这是它的代码:

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

I tried to make an interface for it but I don't know how to have "n" times of a property with a dynamic name我试图为它制作一个接口,但我不知道如何让一个具有动态名称的属性“n”次
something like this:像这样:

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
}

bare in mind that I have the above code from my javascript project and I want to switch to typescript请记住,我有来自我的 javascript 项目的上述代码,我想切换到打字稿

thanks to "BobobUnicorn" in typescript's discord community I now have an answer感谢打字稿不和谐社区中的“BobobUnicorn”,我现在有了答案
this is brilliant!这太棒了!

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;

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM