代码之家  ›  专栏  ›  技术社区  ›  Chui Tey

Typescript-条件映射类型

  •  0
  • Chui Tey  · 技术社区  · 7 年前

    我想使用Knockout observates将一个普通的老Javascript类型映射到一个等价的类型。

    interface KnockoutObservableArray<T> { }
    interface KnockoutObservable<T> { }
    
    class CustomerDto {
        Name: string;
        PetLicenseNumbers: number[];
    }
    
    // manually mapped to Knockout-equivalent 
    class CustomerDtoKo {
        Name: KnockoutObservable<string>;
        PetLicenseNumbers: KnockoutObservableArray<number>;
    }
    

    我正在尝试使用映射类型来自动执行上述操作,但我做不到 找到一种合适的方法将数组有条件地映射到 KnockoutObservableArray<U> 将标量映射到 KnockoutObservable<U>

    type KnockoutType<T> = {
        //[K in keyof T] : KnockoutObservableArray<T[K][0]>
        [K in keyof T] : KnockoutObservable<T[K]>
    }
    
    type CustomerDtoKo2 = KnockoutType<CustomerDto>;
    // gives
    type CustomerDtoKo2 = {
        Name: KnockoutObservable<string>,
        PetLicenseNumbers: KnockoutObservable<number[]> // should be KnockoutObservableArray<number>
    }
    
    1 回复  |  直到 7 年前
        1
  •  4
  •   jcalz    7 年前

    如你所料, conditional types 将帮助您:

    type KnockoutType<T> = {
        [K in keyof T]: T[K] extends Array<infer U> ? 
          KnockoutObservableArray<U> : KnockoutObservable<T[K]>
    }
    

    推荐文章