在following code我想类型过滤属性:
interface Wrapper<T> {
x: T;
}
interface WrapperOpt<T> {
y?: T;
}
interface A {
a1: number;
a2: Wrapper<number>;
a3: WrapperOpt<number>;
b1?: string;
b2?: Wrapper<string>;
b3?: WrapperOpt<string>;
}
type Wrapped = { [key in keyof A]: A[key] extends Wrapper<infer T> ? T : never };
type WrappedOpt = { [key in keyof A]: A[key] extends WrapperOpt<infer T> ? T : never };
它与类型Wrapper
给我Wrapped
只有a2
和b2
不never
:
type Wrapped = {
a1: never;
a2: number;
a3: never;
b1?: never;
b2?: string;
b3?: never;
}
不过,这并不与WrapperOpt
给我WrappedOpt
工作:
type WrappedOpt = {
a1: {};
a2: {};
a3: {};
b1?: {};
b2?: {};
b3?: {};
}
但我希望它有a3
和b3
用正确的类型和所有其它与不:
type Wrapped = {
a1: never;
a2: never;
a3: number;
b1?: never;
b2?: never;
b3?: string;
}
我怎样才能解决这个问题?
顺便说一句,在未来我会在类型摆脱never
根据this description并获得清洁:
type Wrapped = {
a2: number;
b2?: string;
}
type WrappedOpt = {
a3: number;
b3?: string;
}
找到了解决办法:检查extends
左类型时必须被包裹成Required
:
type WrappedOpt = { [key in keyof A]: Required<A[key]> extends WrapperOpt<infer T> ? T : never };