【问题标题】:Typing rest operator object in TypeScript在 TypeScript 中键入 rest 运算符对象
【发布时间】: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 将很难为未来的开发人员维护。

标签: typescript interface spread-syntax


【解决方案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
猜你喜欢
  • 1970-01-01
  • 2023-02-25
  • 2022-06-10
  • 1970-01-01
  • 2021-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-19
相关资源
最近更新 更多