从返回多个(异构)值的 TypeScript 方法中获取值

Posted

技术标签:

【中文标题】从返回多个(异构)值的 TypeScript 方法中获取值【英文标题】:Getting values from a TypeScript method that returns multiple (heterogeneous) values 【发布时间】:2021-05-07 12:48:34 【问题描述】:

我有一个 TypeScript 方法,我想让它返回多个值,例如如下:

public test0() 
  return [true, "hello", Date.now()];

我尝试如下调用这个方法:

let ok: boolean, s: string, d: Date;
[ok, s, d] = this.test0();

这会产生以下错误:

(TS) 键入'字符串 |号码 | boolean' 不可分配给类型 '布尔'。类型“字符串”不可分配给类型“布尔”。

(对于其他两个数组成员也是如此)

我也尝试过对象解构:

public test1() 
  return  success: true, msg: "hello", date: Date.now() ;


...

var  success: ok, msg: s, date: d  = this.test1();

这有效,但前提是 oksd 尚未在当前范围内声明,例如类变量。因此,以下方法不起作用:

var  success: this.ok, msg: this.s, date: this.d  = this.test1();

问题:有没有办法在一行代码中实现多重赋值?例如。通过声明某种接口?

【问题讨论】:

【参考方案1】:

返回一个带有const assertion 的只读元组:

function test0(): readonly [true, "hello", number] 
  return [true, "hello", Date.now()] as const;

为了清楚起见,我添加了一个返回类型,但只需添加as const 断言即可推断出它。

现在,在以下解构中,abc 将具有正确的类型。

const [a, b, c] = test0();

Playground link

【讨论】:

谢谢,我不知道这个功能。但不幸的是,当要分配的变量已经在范围内的其他地方声明时它不起作用,就像我问题的最后一个代码 sn-p 一样,它们是类变量。 @JohnPool 对现有变量或属性的解构赋值已被询问和回答here 和/或here。本质上你不想使用var。这是你的首要问题吗?或者您的主要问题是关于异构数组和元组? 谢谢,我想避免使用var:解构赋值周围的括号给了我想要的结果!

以上是关于从返回多个(异构)值的 TypeScript 方法中获取值的主要内容,如果未能解决你的问题,请参考以下文章

从函数返回多个值的最佳方法是啥?

使用 TypeScript 从数组中删除具有特定 id 字段值的对象的聪明方法是啥? [复制]

从函数调用分配多个返回值的性能[重复]

TypeScript:无法编写异构数组文字

如何从函数返回多个值? [关闭]

C语言返回多个值的方法