寻找将 x 或 x[] 转换为 x[] 的单行代码
Looking for a one-liner to convert x or x[] into x[]
我正在寻找可以替代以下函数的简短有效的纯 TypeScript 单行代码:
function arrayOrMemberToArray<T>(input: T | T[]): T[] {
if(Arrary.isArray(input)) return input
return [input]
}
将上述逻辑塞进单行三元运算符非常混乱,并且在与其他操作链接时很难理解:
const y = (Array.isArray(input) ? input : [input]).map(() => { /* ... */}) // Too messy
Array.concat
在浏览器控制台中工作正常,但 TS 不允许:
const x: number | number[] = 0
const y = [].concat(x)
Error:(27, 21) TS2769: No overload matches this call.
Overload 1 of 2, '(...items: ConcatArray<never>[]): never[]', gave the following error.
Argument of type 'number' is not assignable to parameter of type 'ConcatArray<never>'.
Overload 2 of 2, '(...items: ConcatArray<never>[]): never[]', gave the following error.
Argument of type 'number' is not assignable to parameter of type 'ConcatArray<never>'.
不确定为什么要 one-liner,但您可以只使用三元运算符:
function arrayOrMemberToArray<T>(input: T | T[]): T[] {
return Array.isArray(input) ? input : [input];
}
concat
解决方案不进行类型检查,因为数组文字为空。你需要写
const arr = ([] as number[]).concat(input);
或者,您可以使用 flat
:
const arr = [input].flat();
这不仅更短而且更可取,因为它不依赖于输入的 concat-spreadable property,而是实际检查数组。
这似乎有效:
const x: number | number[] = 0
const y = ((): number[] => [])().concat(x)
console.log(y)
我正在寻找可以替代以下函数的简短有效的纯 TypeScript 单行代码:
function arrayOrMemberToArray<T>(input: T | T[]): T[] {
if(Arrary.isArray(input)) return input
return [input]
}
将上述逻辑塞进单行三元运算符非常混乱,并且在与其他操作链接时很难理解:
const y = (Array.isArray(input) ? input : [input]).map(() => { /* ... */}) // Too messy
Array.concat
在浏览器控制台中工作正常,但 TS 不允许:
const x: number | number[] = 0
const y = [].concat(x)
Error:(27, 21) TS2769: No overload matches this call.
Overload 1 of 2, '(...items: ConcatArray<never>[]): never[]', gave the following error.
Argument of type 'number' is not assignable to parameter of type 'ConcatArray<never>'.
Overload 2 of 2, '(...items: ConcatArray<never>[]): never[]', gave the following error.
Argument of type 'number' is not assignable to parameter of type 'ConcatArray<never>'.
不确定为什么要 one-liner,但您可以只使用三元运算符:
function arrayOrMemberToArray<T>(input: T | T[]): T[] {
return Array.isArray(input) ? input : [input];
}
concat
解决方案不进行类型检查,因为数组文字为空。你需要写
const arr = ([] as number[]).concat(input);
或者,您可以使用 flat
:
const arr = [input].flat();
这不仅更短而且更可取,因为它不依赖于输入的 concat-spreadable property,而是实际检查数组。
这似乎有效:
const x: number | number[] = 0
const y = ((): number[] => [])().concat(x)
console.log(y)