Typescript: создание универсального вспомогательного типа Unwrap

#typescript

#typescript

Вопрос:

Я создал вспомогательный тип, чтобы развернуть внутренний тип Observable<T> :

 type UnwrapObservable<T> = T extends Observable<(infer U)> ? U : never;
 

Это работает просто отлично. Но … моей следующей мыслью было: «Как я могу сделать этот тип полностью универсальным и применять его к любому типу, а не только к наблюдаемому, по существу Unwrap<T> ?

Вот что я попробовал:

 type Unwrap<T, W> = T extends W<(infer U)> ? U : never;
 

Но я получаю:

Тип ‘W’ не является универсальным. ts(2315)

Как я могу создать тип, который разворачивает любой указанный тип?

Комментарии:

1. Я полагаю, вы хотите выразить типы более высокого типа , где W конструктор типа применяется к определенному типу, например W<*> . Вы можете дать проблеме положительный результат, чтобы стимулировать ее разработку.

Ответ №1:

То, что вы пытаетесь сделать, невозможно в TS, но, насколько я знаю, это возможно в потоке)

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

Это самый общий Wrap тип

 type Wrapp<T> = { wrapped: T }
type Unwrap<T> = T extends Wrapp<(infer R)> ? R : never
 

Пожалуйста, смотрите Здесь аналогичное ограничение