以下面的简化代码为例(我已经从实际用例中简化了它,以找到问题的根源(:
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]
之前有条件,所以它保证是一个字符串。如何重写它才能工作?
试试这个:
type TStringWrapper<C extends string> = { wrappedString: C };
type TWrapIfArrayOfStrings<S> = S extends Array<string>
? {
[K in keyof S & number]: TStringWrapper<S[K]>
}
: never;
你知道S
扩展了Array<string>
,那么S
的密钥是number
,而不是像S[0], S[1] ...
那样的string
,等等
这是一个工作示例。