在类型系统里实现通用的 Array.push
例如:
type Result = Push<[1, 2], '3'> // [1, 2, '3']
答案
type Push<T extends readonly any[], U> = [...T, U]
拓展:第二个泛型也支持数组
拓展答案
type Push<T extends readonly any[], U> = U extends readonly any[] ? [...T, ...U] : [...T, U]
这样是不对的,不能通过测试用例:
Expect<Equal<Push<['1', 2, '3'], boolean>, ['1', 2, '3', boolean]>>
原因是
boolean
是true | false
联合类型,Push<['1', 2, '3'], boolean>
会变成['1', 2, '3', true] | ['1', 2, '3', false]
,而不是['1', 2, '3', boolean]
(参考:分布式条件类型)正确的应该是:
type Push<T extends readonly any[], U> = [U] extends [readonly any[]] ? [...T, ...U] : [...T, U]