#typescript #typescript-generics
#typescript #typescript-дженерики
Вопрос:
Я хочу развернуть некоторые типы в TypeScript, вот пример:
// previously defined Type<T>
// example of wrapped type:
type Wrapped = Type<{
a: Type<boolean>,
b: Type<{
c: Type<number>
}>
}>
type Unwrap = ...// this needs to be defined
//And its usage like:
type Unwrapped1 = Unwrap<Wrapped>// should be: { a: boolean, b: { c: number } }
type Unwrapped2 = Unwrap<Type<string>>// should be: string
.
.
.
Как можно определить разворачивание?
Ответ №1:
Для развертывания типа можно использовать сопоставленные и условные типы, а также сопоставленные типы:
type UnwrapObject<T> = {
[P in keyof T] : Unwrap<T[P]>
}
type Unwrap<T> = T extends Type<infer U> ?
U extends object ? UnwrapObject<U> : U:
T extends object ? UnwrapObject<T> : T
//And its usage like:
type Unwrapped1 = Unwrap<Wrapped>// should be: { a: boolean, b: { c: number } }
type Unwrapped2 = Unwrap<Type<string>>// should be: string
declare let d: Unwrapped1;
d.b.c // number