首页 > 解决方案 > 映射数组中未对齐的类型

问题描述

以下面的简化代码示例为例(我已经从我的真实用例中简化了它以找到问题的根源):

type TStringWrapper<C extends string> = { wrappedString: C };

type TWrapIfArrayOfStrings<S> = S extends Array<string>
    ? {
        [K in keyof S]: TStringWrapper<S[K]>
    }
    : never;

我收到以下编译器错误:

Type 'S[K]' does not satisfy the constraint 'string'.
  Type 'S[keyof S]' is not assignable to type 'string'.
    Type 'S[string] | S[number] | S[symbol]' is not assignable to type 'string'.
      Type 'S[string]' is not assignable to type 'string'.

据我所知,这应该编译,因为S[K]它前面的条件保证是一个字符串。如何重写它以使其工作?

标签: typescripttypescript-generics

解决方案


试试这个:

type TStringWrapper<C extends string> = { wrappedString: C };

type TWrapIfArrayOfStrings<S> = S extends Array<string>
    ? {
        [K in keyof S & number]: TStringWrapper<S[K]>
    }
    : never;

你知道Sextends Array<string>then a key of Sis numbernot stringlikeS[0], S[1] ...等等。

是工作示例。


推荐阅读