需要帮助理解下面这段代码的工作原理。
function concatFun<T extends any[], U extends any[]>(
arg1: T[],
arg2: U[]
): [...T, ...U] {
const newArr = [...arg1, ...arg2]; // (T | U)[]
return newArr; // error Type '(T | U)[]' is not assignable to type '[...T, ...U]'.
// Target requires 2 element(s) but source may have fewer.
}
我希望返回类型是 [...T, ...U]
,但返回类型是 (T | U)[]
。
最佳答案
固定 您需要推断提供的参数的文字类型
type Json =
| null
| string
| number
| boolean
| Array<JSON>
| {
[prop: string]: Json
}
function concatFun<
Fst extends Json, T extends Fst[],
Scd extends Json, U extends Scd[]>(
arg1: [...T],
arg2: [...U]
): [...T, ...U] {
return [...arg1, ...arg2]
}
concatFun([1, 2, 3], [4, 5, 6]) // [1, 2, 3, 4, 5, 6]
Playground
更新
function concatFun<
Fst extends Json, T extends Fst[],
Scd extends Json, U extends Scd[]>(
arg1: [...T],
arg2: [...U]
) {
const foo: [...T, ...U] = [...arg1, ...arg2]
return foo
}
}
您可以帮助 TS 推断串联数组。老实说,我不确定 TS 如何解决它。但是,如果您从 foo
[...T, ...U]
,则错误消息非常直观
关于typescript - 一起使用 Typescript 可变元组类型和 Javascript Spread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72445452/
相关文章:
rust - "the size for values of type cannot be know
reactjs - RTK 查询维持 `isLoading` 缓存失效后自动重新获取
flutter - 如何在 ListView.builder flutter 中正确使用 findC
f# - 使用 Foq 模拟 Microsoft.Extensions.Logging.ILogge
node.js - Pug - 包括带有 "include"关键字的 C 代码
java - 这个官方 Xml 模式是否无效或者是 Jaxb 的错误限制