TypeScript中是否有一种方法可以使用接口作为保护对象而又不丢失对象的特殊性?

时间:2019-02-14 21:28:27

标签: typescript types interface

我在尝试为TypeScript中的共享模块创建接口时遇到一个问题,出于这个问题的目的,我们假设它具有以下形状:

interface A {
  x: string;
  y: { [name: string]: (...args: any) => {type: string; payload?: any} };
  z?: () => any
}

此界面的用途有两个:

  1. 对于生产模块的人,我希望他们能够知道他们创建的东西符合A。
  2. 对于使用该模块的人,我希望他们能够拥有最具体的输入方式。

例如,如果我有:

const bar = {
  x: 'hello',
  y: { 'world': (a: string, b: number) => ({ type: a, payload: b}) }
}

请注意缺少对接口A的引用。

如果要输入:bar.,我会智能地知道它具有属性xy。但是,即使输入bar.y.,我也会得到提示,提示world存在,并且函数类型与之相关。

但是,如果我添加A

const bar: A = {
  x: 'hello',
  y: { 'world': (a: string, b: number) => ({ type: a, payload: b}) }
}

它可以帮助某人意外添加错误的属性,例如:

const bar: A = {
  iDontBelong: true, // wrong
  x: 'hello',
  y: { 'world': (a: string, b: number) => ({ type: a, payload: b}) }
}

甚至

const bar: A = {
  x: 5, // wrong
  y: { 'world': (a: string, b: number) => ({ type: a, payload: b}) }
}

现在的问题是,如果有人要导入bar并键入bar.,他们将获得直接用于界面A的建议。它会丢失bar仅包含xy(而没有z)的知识,并且还会丢失有关y的特定类型含义的信息它甚至都不知道world上存在y

有什么办法可以使这两种东西同时存在吗?

1 个答案:

答案 0 :(得分:1)

  

有什么办法可以使这两种东西同时存在

只要您说asdf uninstall erlang <VERSION> brew install wxmac asdf install erlang <VERSION> ,您就不会对物品袋(: A中的东西有智力感知。

您可以通过不进行注释而进行类型测试来避免这种情况,例如:

[name: string]