代码之家  ›  专栏  ›  技术社区  ›  David Sherret

条件类型-匹配特定的可空类型

  •  0
  • David Sherret  · 技术社区  · 8 年前

    我正在尝试在条件类型中匹配可为null的类型:

    interface Unwrapped { dummyProp: string; }
    interface UnwrappedArray<T extends Unwrapped> extends Array<T> { }
    interface Wrapped<T extends Unwrapped> { unwrapped: T; }
    
    type ToPropertyWrapped<T, K extends keyof T> =
        T[K] extends UnwrappedArray<infer ArrayElementType> ? Wrapped<ArrayElementType>[] :
        T[K] extends Unwrapped ? Wrapped<T[K]> :
        NonNullable<T[K]> extends Unwrapped ? Wrapped<NonNullable<T[K]>> | undefined :
        T[K];
    

    但我得到了这个错误。。。

    错误TS2344:类型“NonNullable<T[K]>'不满足约束“Unwrapped”。

    类型“T[K]”不能分配给类型“Unwrapped”。

    。。。路过时 Wrapped<NonNullable<T[K]>> 。如何消除此编译错误?

    // example use that works... just have the compile error above
    interface PropType extends Unwrapped {
    }
    
    interface Test extends Unwrapped {
        prop: PropType;
        nullableProp: PropType | undefined;
        arrayProp: PropType[];
        numberProp: number;
    }
    
    let t: ToPropertyWrapped<Test, "prop">;         // Wrapped<PropType>
    let u: ToPropertyWrapped<Test, "nullableProp">; // Wrapped<PropType> | undefined
    let v: ToPropertyWrapped<Test, "arrayProp">;    // Wrapped<PropType>[]
    let w: ToPropertyWrapped<Test, "numberProp">;   // number
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   David Sherret    8 年前

    目前我发现的方法是使用类型参数作为别名:

    type ToPropertyWrapped<T, K extends keyof T, NonNullableValue = NonNullable<T[K]>> =
        T[K] extends UnwrappedArray<infer ArrayElementType> ? Wrapped<ArrayElementType>[] :
        T[K] extends Unwrapped ? Wrapped<T[K]> :
        NonNullableValue extends Unwrapped ? Wrapped<NonNullableValue> | undefined :
        T[K];
    

    我猜这是编译器的一个限制,即问题中的代码不能工作。

    推荐文章