【问题标题】:Typescript - conditional mapped typesTypescript - 条件映射类型
【发布时间】:2019-03-21 14:28:18
【问题描述】:

我想使用 Knockout observables 将一个普通的旧 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&lt;U&gt; 的正确方法 同时将标量映射到KnockoutObservable&lt;U&gt;

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>
}

【问题讨论】:

    标签: typescript knockout.js


    【解决方案1】:

    如您所愿,conditional types 将帮助您:

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

    祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-25
      • 2021-01-31
      • 2017-08-08
      • 2018-02-05
      • 2022-01-13
      • 2018-06-25
      • 2018-10-19
      • 1970-01-01
      相关资源
      最近更新 更多