Расширение вложенного интерфейса машинописного текста - PullRequest
0 голосов
/ 09 июля 2020

У меня есть несколько сложных типов машинописных текстов, которые создаются с помощью генератора кода, и я хочу иметь возможность использовать части этих типов без необходимости снова определять все это.

Например, мой сгенерированный интерфейс может выглядеть так (сильно упрощено)

type Transportation = {
  vehicle: { 
    truck: {...}
    car: {
      make: string
      model: string
      weight: string
      ...
    }
  }
  boat: {...}
  ...
}

Теперь предположим, что я пишу функцию, которая берет машину и что-то с ней делает

/* This type won't work, I'm asking if there is a proper way to do this*/
processCar(car: Transportation.vehicle.car) {
  //TODO: process the car
}

const transport: Transportation = {...}
processCar(transport.vehicle.car)

Есть ли способ сделать тип, основанный на части существующего типа, без необходимости определять весь автомобиль как его собственный тип или интерфейс? Можно ли его расширить интерфейсом или чем-то еще? Спасибо!

А для контекста мои сложные сгенерированные типы берутся из генератора кода graphql . В него можно внести некоторые настройки, но, к сожалению, я не знаю способа заставить его генерировать все в красивых разделенных интерфейсах.

1 Ответ

0 голосов
/ 09 июля 2020

с использованием транспорта ['Vehicle'] ['Car'] - это своеобразное решение.

Лучше всего набрать его, если типы доступны и вы можете использовать их следующим образом.

вы можете использовать такие пространства имен

namespace Transportation {
    export namespace Vehicle {
        export interface Car {
            make: string;
            model: string;
            weight: string;
            ...
        };
        export interface Truck {
            make: string;
            model: string;
            weight: string;
            ...
        }
    }

    export interface Boat {
        ...
    }
}

let car: Transportation.Vehicle.Car;

Но, честно говоря, этот подход не кажется лучшим случаем.

Обычно вы просто используете одно пространство имен и экспортируете каждое интерфейс, который вам нужен снаружи.

namespace Transportation {
    //note, that the Vehicle isn't exported
    interface Vehicle {
        make: string;
        model: string;
        weight: string;
        ...
    }
    export interface Car extends Vehicle {
        doors: number;
    }
    export interface Truck extends Vehicle {
        transportmass: number;
    }

    export interface Boat {
        ...
    }
}

//let car: Transportation.Vehicle.Car; this won't work anymore
//let vehicle: Transportaion.Vehicle; won't work either
let car: Transportation.Car;
...