jecki / ts2python

Python-interoperability for Typescript-Interfaces
Apache License 2.0
39 stars 3 forks source link

Second-level union of dictionaries generated incorrectly #21

Open Tatsh opened 7 months ago

Tatsh commented 7 months ago

Input:

interface CalendarJSON {
  date: string;
  fiscal: {
    month: MonthNumbers;
    quarter:
      | { name: 'Q1'; value: 1 }
      | { name: 'Q2'; value: 2 }
      | { name: 'Q3'; value: 3 }
      | { name: 'Q4'; value: 4 };
    week: WeekNumbers;
    year: CommonYears;
  };
  gregorian: {
    day_of_week:
      | { name: 'Monday'; value: 0 }
      | { name: 'Tuesday'; value: 1 }
      | { name: 'Wednesday'; value: 2 }
      | { name: 'Thursday'; value: 3 }
      | { name: 'Friday'; value: 4 }
      | { name: 'Saturday'; value: 5 }
      | { name: 'Sunday'; value: 6 };
    month: MonthNumbers;
    quarter: QuarterNumbers;
    week: WeekNumbers;
    year: CommonYears;
  };
  id: string;
}

Output:

class CalendarJSON_Fiscal_0_Quarter_0(TypedDict):
    name: Literal['Q1']
    value: Literal[1]
class CalendarJSON_Fiscal_0_Quarter_1(TypedDict):
    name: Literal['Q2']
    value: Literal[2]
class CalendarJSON_Fiscal_0_Quarter_2(TypedDict):
    name: Literal['Q3']
    value: Literal[3]
class CalendarJSON_Fiscal_0_Quarter_3(TypedDict):
    name: Literal['Q4']
    value: Literal[4]
class CalendarJSON_Fiscal_0(TypedDict):
    month: 'MonthNumbers'
    quarter: CalendarJSON_Fiscal_0_Quarter_0 | CalendarJSON_Fiscal_0_Quarter_1 | CalendarJSON_Fiscal_0_Quarter_2 | CalendarJSON_Fiscal_0_Quarter_3
    week: 'WeekNumbers'
    year: 'CommonYears'
class CalendarJSON_Gregorian_0_Day_of_week_0(TypedDict):
    name: Literal['Monday']
    value: Literal[0]
class CalendarJSON_Gregorian_0_Day_of_week_1(TypedDict):
    name: Literal['Tuesday']
    value: Literal[1]
class CalendarJSON_Gregorian_0_Day_of_week_2(TypedDict):
    name: Literal['Wednesday']
    value: Literal[2]
class CalendarJSON_Gregorian_0_Day_of_week_3(TypedDict):
    name: Literal['Thursday']
    value: Literal[3]
class CalendarJSON_Gregorian_0_Day_of_week_4(TypedDict):
    name: Literal['Friday']
    value: Literal[4]
class CalendarJSON_Gregorian_0_Day_of_week_5(TypedDict):
    name: Literal['Saturday']
    value: Literal[5]
class CalendarJSON_Gregorian_0_Day_of_week_6(TypedDict):
    name: Literal['Sunday']
    value: Literal[6]
class CalendarJSON_Gregorian_0(TypedDict):
    day_of_week: CalendarJSON_Gregorian_0_Day_of_week_0 | CalendarJSON_Gregorian_0_Day_of_week_1 | CalendarJSON_Gregorian_0_Day_of_week_2 | CalendarJSON_Gregorian_0_Day_of_week_3 | CalendarJSON_Gregorian_0_Day_of_week_4 | CalendarJSON_Gregorian_0_Day_of_week_5 | CalendarJSON_Gregorian_0_Day_of_week_6
    month: 'MonthNumbers'
    quarter: 'QuarterNumbers'
    week: 'WeekNumbers'
    year: 'CommonYears'

class CalendarJSON(TypedDict):
    date: str
    fiscal: CalendarJSON_Fiscal_0_Quarter_0
    gregorian: CalendarJSON_Gregorian_0_Day_of_week_0
    id: str

Note the fiscal and gregorian fields. They are pointing to the first field type of the dictionary rather than the dictionary type itself.

Expected output for CalendarJSON:

class CalendarJSON(TypedDict):
    date: str
    fiscal: CalendarJSON_Fiscal_0
    gregorian: CalendarJSON_Gregorian_0
    id: str