在 TypeScript 中键入 rest 运算符对象

Posted

技术标签:

【中文标题】在 TypeScript 中键入 rest 运算符对象【英文标题】:Typing rest operator object in TypeScript 【发布时间】:2019-02-04 15:55:20 【问题描述】:

我试图使用 rest 运算符从 Object 中删除一个属性,但不知道如何在新 Object 上强制类型。

interface Ab 
  a: string;
  b: number;


interface Bc 
  b: number;
  c: boolean | undefined;


const ab: Ab =  a: 'a', b: 1;
const a, ...bc = ...ab, c: true;

我知道 bc 现在有一个类型


  b: number;
  c: boolean;

有没有办法强制 bc 明确地属于 Bc 类型?

【问题讨论】:

您想这样做有什么特别的原因吗?两种类型相互兼容,因为它们具有相同的结构并且 Typescript 使用结构类型 当类型更复杂时,它主要用于开发人员的理智。它们在技术上是相同的,但知道确切的类型是什么会很有帮助。在我的例子中,有些类型是 string | undefined,所以将它作为 string 将很难为未来的开发人员维护。 【参考方案1】:

其实这是一个非常有趣和棘手的问题 :) 所以这是我的解决方案:

interface Abc extends Ab, Bc 
  bc: Bc;


const ab: Ab =  a: 'a', b: 1;
const  a, ...bc : Abc =  ...ab, c: true  as Abc;

Playground link

【讨论】:

是的,但问题的目的是明确设置 bc 变量的类型。 谢谢大家帮忙,但是bc的类型好像是 ab?: Ab | undefined; bc?: Bc | undefined; b: number; c: boolean; 不知道能不能把类型变成Bc 当然,像这样声明Abc接口:interface Abc extends Ab, Bc bc: Bc; 我试过了,但它仍然返回类型const bc: bc: Bc; b: number; c: boolean; ,其中bc.bc 将是undefined 看起来您正在寻找的内容在 TS 团队计划中 :) 在 gihub 上查看此问题 - github.com/Microsoft/TypeScript/issues/10727

以上是关于在 TypeScript 中键入 rest 运算符对象的主要内容,如果未能解决你的问题,请参考以下文章

在 TypeScript 中键入匿名对象的属性

在反应 TypeScript 中键入输入的键值 [重复]

是否可以在 TypeScript 中精确键入 _.invert?

如何在 TypeScript 3+ 中正确键入通用元组剩余参数?

如何使用 Typescript 在 mongoose 中正确键入对象 ID 数组

如何使用 Typescript 在 mongoose 中正确键入对象 ID 数组