Typescript:将对象转换为数组的简单方法

3
我正在将对象中的某些属性转换为数组。
const result = ({ a, b }: { a: string, b: number }) => [a, b]; // (string | number)[]

然而,标准方式总是返回一个不足的 TypeScript 类型 (string | number)[]

我必须始终指定输出类型以使其正确地推断结果的类型。

const result = ({ a, b }: { a: string, b: number }): [string, number] => [a, b]; // [string, number]

有更简单的方法吗?

3个回答

4

创建数组后添加as const - 这被称为const断言。它表示新创建的数组实际上是元组,如果你要依靠它有两个元素,其中第一个是字符串,第二个是数字,那么它必须是元组。

// readonly [string, number]
const result = ({ a, b }: { a: string, b: number }) => [a, b] as const; 

这个例子与您原始问题中的示例唯一的区别是结果类型将是“readonly”。除非您进行特定的断言,否则将无法更改result的值。

1

不可否认,为了获得一个元组类型,您需要增加一些冗长的代码。您可以创建一个辅助函数,从数组字面量生成元组类型——无论是声明常量还是直接返回签名都是可以的:

const asTuple = <T extends [any, ...any]>(array: T) => array;

const objectToTuple = ({ a, b }: { a: string, b: number }) => asTuple([a, b]);

const result = objectToTuple({a: "a", b: 1}) // [string, number]

1
据我所知,目前没有这样的功能。您可以使用 [string, number] 的形式来表示 [a, b],但这只是增加了冗余。另一种选择是将 result 声明为函数类型,但这只是把“问题”转移了过来。此外,添加小的返回类型声明并不会带来太大的负担。TypeScript 没有其他更好的解决方案,因为它不能默认假设您想要一个 [string, number]。这将远非向后兼容(甚至不受大多数人欢迎)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接