通过属性类型中提取值

问题描述 投票:0回答:1

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只有a2b2never

type Wrapped = {
    a1: never;
    a2: number;
    a3: never;
    b1?: never;
    b2?: string;
    b3?: never;
}

不过,这并不与WrapperOpt给我WrappedOpt工作:

type WrappedOpt = {
    a1: {};
    a2: {};
    a3: {};
    b1?: {};
    b2?: {};
    b3?: {};
}

但我希望它有a3b3用正确的类型和所有其它与不:

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;
}
typescript
1个回答
0
投票

找到了解决办法:检查extends左类型时必须被包裹成Required

type WrappedOpt = { [key in keyof A]: Required<A[key]> extends WrapperOpt<infer T> ? T : never };
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.