【问题标题】:Check object interface via Typescript通过 Typescript 检查对象接口
【发布时间】:2019-09-10 11:57:07
【问题描述】:

有没有最好的方法来检查一个对象与打字稿接口?

我在两个模式之间工作,其中一个扩展了另一个。我需要将扩展​​转换回基类,并通过从扩展中删除道具以将其塑造为原始基类来实现。一个例子:

interface Base {
  prop1: string
  prop2?: string
  prop3?: string
}

interface Extended extends Base {
  prop4: string
  prop5: string
}

所以为了让Extended回到Base,我需要delete props prop4prop5

这当然很容易做到,但是,我需要确保最终结果符合Base 类,因为deleting props does not tell the compiler anything,并且扩展将通过Base 类型检查。

我已经研究过使用类型保护和other alternatives,但是,我还没有找到一种方法来适应Base 中的可选属性,或者一种看似有效的方法。

这是类型保护的基本计划以及处理可选道具:

function isBase(arg: any): arg is Base {
  return arg
    && arg.prop1
    && (arg.prop2 || true)
    && (arg.prop3 || true)
}

除了要为很多道具做大量工作之外,它还很脆弱。 Base 更改后,此技术将不再按预期工作。我觉得(应该)有一些通过实用程序类型的 Typescript 方式可以根据Base 接口检查道具,所以它总是会按预期工作。

更新

我找到了this。看起来非常接近,但无法让它与接口一起使用。

【问题讨论】:

  • 实用程序类型不起作用,因为接口是设计时类型而不是运行时类型,因此您需要首先编译类型保护代码,然后才能运行。类型保护是 AFAIK 的唯一解决方案。
  • "我需要将扩展​​转换回基础" 为什么?如果该类型扩展了一个基类,那么该类型可以被视为一个基类,您不需要删除属性...
  • 扩展名用于客户端目的,基础是存储在数据库中的内容。因此,虽然它可以被视为基础,但我不想存储扩展保存的额外数据(在数据库中),并且想在通过网络发送之前检查是否是这种情况。

标签: typescript


【解决方案1】:

如果您需要将 Base 保留为独立属性,使用 composition 而不是 inheritance 可能是更好的方法,例如:

interface Base {
  prop1: string
  prop2?: string
  prop3?: string
}

interface Extended {
  data: Base
  prop4: string
  prop5: string
}

使用Extended 做任何需要的事情,但只将data 发送到数据库。

【讨论】:

  • 这看起来是个不错的技术。虽然这意味着需要更新 Extended 类的所有使用以拥有由 Base 组成的 data 属性。
猜你喜欢
  • 2012-05-08
  • 2019-09-30
  • 2016-08-06
  • 2015-08-17
  • 2020-03-06
  • 2016-02-21
  • 1970-01-01
  • 2020-10-30
相关资源
最近更新 更多