Есть ли способ (или обходной путь) для деструктуризации типов / интерфейсов машинописного текста? - PullRequest
0 голосов
/ 30 апреля 2020

Допустим, у меня есть класс с большим количеством параметров типа:

class BaseClass<T extends T1, U extends U1, V extends V1, /* etc. */ > 

Есть ли способ создать аргумент одного типа, который мог бы позволить "распространять" или "деструктурировать" вдоль строк что вы можете делать с объектами в ES6?

Таким образом, вместо необходимости реализовывать подклассы как

class FooClass extends BaseClass<TFoo, UFoo, VFoo, /* etc. */ >

, я мог бы установить все аргументы типа и передать их в один go

// example of what I'd like to be possible:
metatype FooTypes = <TFoo, UFoo, VFoo, /* etc. */>
class FooClass extends BaseClass<...FooTypes>

Причина, по которой я надеюсь сделать что-то подобное, заключается в том, что у меня есть разные объекты, отвечающие за разные свойства сущностей, такие как «заметки» и «комментарии», которые имеют почти дюжину связанных типов (например, локальная форма, ответ API, форма внутри стороннего кэша и т. д. c.), но не каждый объект, взаимодействующий с ними, должен работать с каждым из этих типов.

То, что я хочу сделать, это передать одну ссылку, например «NoteTypes», «CommentTypes», что по сути означает «Вы можете сопоставить любые параметры типа, которые вам нужны, с этим».

Проблема I ' Казалось бы, описание m лучше всего решить «деструктуризацией типов», но эта проблема GitHub , похоже, указывает на то, что это пока невозможно.

Вместо фактической деструктуризации типов, что было бы лучшим способом приблизиться к этому?

1 Ответ

1 голос
/ 30 апреля 2020

Нет такого синтаксиса для выполнения деструктурирования объектов на уровне типов, как в microsoft / TypeScript # 13135 или деструктуризации массивов на уровне типов, как в microsoft / TypeScript # 5453 . Но, к счастью, вы можете выполнить тип объекта / кортежа индексирование через типы поиска . Если у вас есть тип объекта type M = {foo: F, bar: B}, где F и B являются существующими типами, вы можете восстановить F, просмотрев "foo" в M: M["foo"]. И B - это M["bar"].

. Учитывая это, вы можете решить упаковать свои T, U, V, et c в одну карту типов M, например this:

class BaseClass<M extends { T: T1, U: U1, V: V1 }> { /* ... */ }

Если вам нужно обратиться к T, U и V, типы вы можете посмотреть их:

class BaseClass<M extends { T: T1, U: U1, V: V1 }> {
    constructor(public t: M["T"], public u: M["U"], public v: M["V"]) {
    }
}

В качестве примера здесь , BaseClass<M> имеет конструктор, принимающий параметры старых типов T, U и V.


Тогда ваш код удобства создания подклассов будет выглядеть так:

type FooTypes = { T: TFoo, U: UFoo, V: VFoo }
class FooClass extends BaseClass<FooTypes> { }

Это должно сработать, хотя было бы более удобно, если бы существовал простой синтаксис для деструктурирования вместо использования поиска. Прямо сейчас вы можете сделать что-то вроде

    type T = M["T"];
    type U = M["U"];
    type V = M["V"];

, но это довольно многословно и работает только в глобальной или функциональной области, а не внутри класса (см. microsoft / TypeScript # 7061 ), поэтому на практике я бы просто использовал M["T"] и M["U"] и c везде, где я раньше использовал T и U.


Хорошо, надеюсь, это поможет; удачи!

Детская площадка ссылка на код

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