Проблема
Мы создаем сопоставленный тип, который исключает свойства типа Function
. У нашего подхода есть проблема: он также удаляет необязательный декоратор (?
) из сопоставленных свойств.
Размножение
Вот упрощенное воспроизведение такого поведения. NoOpMap1
ведет себя так, как мы хотим, а NoOpMap2
имеет проблемное поведение.
type NoOpMap1<T> = { // Good. This one does not remove the ?
[K in keyof T]: T[K];
};
type Keys<T> = {
[K in keyof T]: K;
}[keyof T];
type NoOpMap2<T> = { // Problem. This one removes the ?
[K in Keys<T>]: T[K];
};
Демо
type SomeType = {
foo?: string,
}
// type SomeTypeNoOpMap1 = { foo?: string; }
type SomeTypeNoOpMap1 = NoOpMap1<SomeType>;
// type SomeTypeNoOpMap2 = { foo: string; }
type SomeTypeNoOpMap2 = NoOpMap2<SomeType>;
NoOpMap1
ведет себя так, как ожидалось. Он сохраняет декоратор ?
в свойстве foo
. NoOpMap2
удаляет это.
Вопрос
Почему NoOpMap2
удаляется ?
декоратор? Как добиться подобного результата, не удаляя его?
Фактический вариант использования
Вот полный тип, который мы пытаемся построить:
type DataPropertyNames<T> = {
[K in keyof T]: T[K] extends Function ? never : K;
}[keyof T];
type DataPropertiesOnly<T> = {
[K in DataPropertyNames<T>]
: T[K] extends (string | number | boolean) ? T[K]
: T[K] extends (infer A)[] ? DataPropertiesOnly<A>[]
: DataPropertiesOnly<T[K]>;
};
Как уже упоминалось, указанный выше тип отвечает за удаление свойств типа Function
без удаления ?
декоратора из оставшихся свойств.