在类型系统里实现通用的 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](参考:[[002.分布式条件类型|分布式条件类型]])
正确的应该是:
type Push<T extends readonly any[], U> = [U] extends [readonly any[]] ? [...T, ...U] : [...T, U]