这个问题对我来说有点难以表达,这可能是我在研究中没有发现任何东西的原因.
我试图得到一个最终只有数组的类型.我总是希望最终得到"一级"数组(如果给定了数组的数组,我不关心输出.在我的情况下不会发生这种情况).因此,想要的结果如下:
type T1 = ForceArray<string> // wanted: string[]
type T2 = ForceArray<string[]> // wanted: string[]
我可以通过以下代码来实现这一点:
type ForceArray<T> = NonNullable<T> extends Array<any> ? T : Array<T>
这里使用NonNullable
是因为在实际用例中,ForceArray<T>
用于接口属性,这是可选的.除了联合类型之外,这种方法效果很好.
type T3 = ForceArray<string | string[]> // shows (string | string[])[] but I want string[]
此外,其他联合类型也应转换为不起作用的数组:
type T4 = ForceArray<number | string[]> // wanted: number[] | string[]
type T5 = ForceArray<number[] | string> // wanted: number[] | string[]
在typescript文档中,他们提到了Distributive conditional types个.但就我对文档的理解而言,我的代码应该可以正常工作.所以很明显我没有正确理解文档.
有没有办法达到预期的行为?
Additional information:
产生输出的实际代码非常简单,这就是为什么我认为应该有一个解决方案:
const forceArray = (value) => Array.isArray(value) ? value : [value];
此函数用于这样的上下文,其中obj
可以实现任何接口(具有可选属性):
const convertObjectValuesToArray = (obj) => {
const newObj = {};
for (const key of obj) {
newObj[key] = forceArray(obj[key]);
}
return newObj;
}