【发布时间】:2021-12-10 02:20:18
【问题描述】:
我想定义一个函数,它接受一个字符串或一个字符串数组并用它们做一些事情,例如大写它们。
如果函数接受一个字符串,它应该返回一个字符串。而且,如果它需要一个字符串数组,它应该返回一个字符串数组。
这是我失败的尝试:
const uppercase = <Params extends string | string[]>(params: Params): Params => {
if (typeof params === "string") {
return params.toUpperCase(); // ERROR: 'string' is assignable to the constraint of type 'Params', but 'Params' could be instantiated with a different subtype of constraint 'string | string[]'.
}
return params.map(param => param.toUpperCase()); // ERROR: 'string[]' is assignable to the constraint of type 'Params', but 'Params' could be instantiated with a different subtype of constraint 'string | string[]'
}
你会如何解决这个问题?
【问题讨论】:
-
如果直接使用类型联合(而不是使用/定义参数)会发生什么? “不同的子类型” 看起来很有趣。
-
它不会表达我的意图,因为它允许您传递
string并返回string[]。
标签: typescript typescript-generics