typescript - .map() 上的联合类型的字符串 [] | string[][] 导致错误
问题描述
interface Props {
data: string[] | string[][];
}
function Component({ data }: Props) {
return data.map(v => v);
}
map() 抛出错误:此表达式不可调用。联合类型的每个成员 '((callbackfn: (value: string, index: number, array: string[]) => U, thisArg?: any) => U[]) | ((callbackfn: (value: string[], index: number, array: string[][]) => U, thisArg?: any) => U[])' 有签名,但这些签名都不兼容彼此。(2349)
为什么会这样,我该如何解决?
解决方案
这是 TypeScript 的限制。如果您有两个数组的并集:
string[] | number[]
你不能在它上面调用任何方法。你需要先脱离工会。
解决方案一
interface Props {
data: string[] | string[][];
}
function isString(arg: any): arg is string {
return typeof arg === 'string'
}
function isStringArray(arg: any): arg is string[] {
return Array.isArray(arg) && arg.every(isString);
}
function Component({ data }: Props) {
if (isStringArray(data)) {
data.map(str => str)
} else {
data.map(strArr => strArr);
}
}
解决方案二
尝试通用版本。
interface Props<T> {
data: T[];
}
function Component<T extends string | string[]>({ data }: Props<T>) {
return data.map(v => v);
}
推荐阅读
- python - 如何在不提供完整路径的情况下在 PHP 中包含 python 文件?
- java - 如何在 Joomla 中添加 Java
- ios - 真实 iPhone 设备上的 Fluter 应用程序无法打开
- amazon-web-services - 如何在部署应用程序 Elastic beanstalk 上修改 NGINX 配置
- kubernetes - 部署 pod 或 CronJob 以每分钟完成一项工作?
- php - 当我要求查找标签时,为什么 Simple Html Dom php 不返回任何内容?
- java - Java:有没有更优雅的方法可以使用 reduce 从现有列表中提取新列表?
- r - 如何根据模式重命名列名
- python - DRF select_related 和 prefetch_related 不起作用
- regex - 我想在 JS 中使用正则表达式精确匹配字符?