Как создать тип исключая методы экземпляра из класса в машинописи? - PullRequest
1 голос
/ 02 апреля 2019

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

Например, если я определю класс следующим образом:

class MyObject {

  constructor(public prop1: string, public prop2: number) {}

  instanceMethod() { ... }
}

Я хотел бы иметь тип, скажем MyObjectConstructor, который будет выглядеть так:

type MyObjectConstructor = {
  prop1: string;
  prop2: string;
}

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

Есть ли способ определить универсальный тип ConstructorType<T>, который возвращает только свойства класса в машинописи?

Ответы [ 3 ]

1 голос
/ 02 апреля 2019

Я нашел способ исключить все свойства, соответствующие данному типу, благодаря этой статье: https://medium.com/dailyjs/typescript-create-a-condition-based-subset-types-9d902cea5b8c

Я сделал несколько изменений, но вот детали:

// 1 Transform the type to flag all the undesired keys as 'never'
type FlagExcludedType<Base, Type> = { [Key in keyof Base]: Base[Key] extends Type ? never : Key };

// 2 Get the keys that are not flagged as 'never'
type AllowedNames<Base, Type> = FlagExcludedType<Base, Type>[keyof Base];

// 3 Use this with a simple Pick to get the right interface, excluding the undesired type
type OmitType<Base, Type> = Pick<Base, AllowedNames<Base, Type>>;

// 4 Exclude the Function type to only get properties
type ConstructorType<T> = OmitType<T, Function>;

Попробуйте

Возможно, есть более простой способ, я попытался поиграть с ConstructorParameters и определить сигнатуру конструктора, но безрезультатно.

0 голосов
/ 02 апреля 2019

Учитывая класс, содержащий как свойства, так и методы, я бы хотел получить тип, который juste [sic] содержит его свойства.

Из вашего примера кажется, что выхотите, чтобы результат содержал только поля (, а не только свойства ).Вот тип, который выбирает поля из объекта или экземпляра класса.

type DataPropertyNames<T> = {
  [K in keyof T]: T[K] extends Function ? never : K;
}[keyof T];

type DataPropertiesOnly<T> = {
  [P in DataPropertyNames<T>]?: T[P] extends object ? DTO<T[P]> : T[P]
};

export type DTO<T> = DataPropertiesOnly<T>;

Я использовал аббревиатуру DTO для обозначения объекта передачи данных.

0 голосов
/ 02 апреля 2019

Вы пытались использовать актерский состав?

const obj = <MyObject> {
  prop1: "abc",
  prop2: "xyz"
}
...