使用const assertion,可以很好地将对象/数组文字的类型缩小到它的元素。
例如
const arr = [
[5, "hello"],
[5, "bye"],
] as const;
type T = typeof arr; // type T = readonly [readonly [5, "hello"], readonly [5, "bye"]]
(没有as const
,T
会是type T = (string | number)[][]
,它非常宽,有时是不需要的。)
现在,问题是as const
数组readonly
也因此而变得更好,而我只是将它的类型缩小了。因此,它不能传递给以下函数。
function fiveLover(pairs: [5, string][]): void {
pairs.forEach((p) => console.log(p[1]));
}
fiveLover(arr); // Error
错误是:
type
'readonly [readonly [5, "hello"], readonly [5, "bye"]]'
的参数不能分配给 type 的参数'[5, string][]'
。该类型'readonly [readonly [5, "hello"], readonly [5, "bye"]]'
是'readonly'
并且不能分配给可变类型'[5, string][]'
。(2345)
问题
如何在不获取不需要的readonly
属性的情况下缩小类型?(最好在对象/数组创建时。)