【发布时间】:2020-04-22 19:43:48
【问题描述】:
我有一个提取类型叫做
type ExtractProps<T, K> = { [C in keyof T]:T[C] extends K ? K: never }
我想从中提取一个类型。
type FormRelation<T> = {
[C in keyof T]: T[C] extends string ? FormField : FormFieldGroup
}
参数也是FormRelation。
这种类型应该只从 T 中提取指定的 K 类型。它确实提取了它,但是这种类型在一个应该可以工作的参数中失败了。
FormRelation<T>[K] extends FormField ? FormField : never is not assignable to type T[K] extends string ? FormField : FormFieldGroup
never 在打字稿中被认为是底部类型,因此它不应该包含任何值。这意味着编译器应该忽略 never 类型的道具,因为它不包含值。但是,事实并非如此,这意味着这必须是预期的功能。从具有指定类型的对象中提取属性有哪些解决方法?
新更新
所以我上网查了一下,找到了解决办法
type ExtractProps<T, TProps extends T[keyof T]> = Pick<T, ExtractPropsKey<T, TProps>>;
type ExtractPropsKey<T, TProps extends T[keyof T]> = {
[P in keyof T]: T[P] extends TProps ? P : never;
}[keyof T];
这些类型有效,但是我的运行时函数不接受 class FormField,因为它不扩展 T[keyof T],即使 FormField 是 FormRelation 道具的可能类型。
有没有办法将所有泛型条件类型提取到一个联合类型中??
【问题讨论】:
-
你应该发布一个完整的、最好是独立的例子来说明你遇到的问题..否则这太模糊了
-
我刚刚添加了有关我尝试从中提取的类型和参数类型的更多详细信息。
标签: typescript templates generics metaprogramming typescript-generics