【问题标题】:Typescript - return type that is part of whole interface (check if it implements other interface)Typescript - 作为整个接口一部分的返回类型(检查它是否实现了其他接口)
【发布时间】:2020-01-15 13:55:17
【问题描述】:

我有一个通用 reducer,它的返回类型是 TableState。

const reducerFactory = ..... = (): TableState => ....

表状态:

 interface TableState {
  filters: Filter;
  data: TableData;
  isLoading: boolean;
}

使用这个 reducer factory 实现 TableState的每个组件。 例如

interface SalesReportState implements TableState {
  someCommonField: string;
}

应用构建失败,因为类型不匹配。我可以做someCommonField?: string; 但 someCommonField 应该是强制性的。

如果表类型实现了表状态,是否有一个 Typescript 功能可以检查返回类型?所以返回类型将是确保它是 TableState 实例的某种类型,而不是 TableState 类型。

【问题讨论】:

  • 凸轮你写一些更多的细节。 TableState 并没有对我说太多。你能展示一下这个界面以及你想如何使用它吗?
  • @MaciejSikora 已编辑,现在应该更好
  • 你能粘贴错误吗
  • TypeScript 错误:TableState 中缺少 someCommonField
  • 给我reducer的代码,我会给你一个答案

标签: reactjs typescript redux


【解决方案1】:

如果你想知道一个对象是否实现了TableState,你可以使用:

  1. instanceof
if (obj instanceof TableState) // returns true if object implements TableState

仅适用于抽象类

  1. type-guards。示例:
let obj = {}; // an object you want to check

/**
  * A discriminator is a property which determines if the object in question is
  * a TableState 
  */

function isTableState(obj: any): obj is TableState {
  return obj &&
    obj.filter &&
    obj.data &&
    obj.isLoading && typeof(obj.isLoading) === 'boolean';
}

// check phase
if (isTableState(obj)) {
  // object is automatically casted to TableState
}

PS:如果你想用另一个接口扩展一个接口,使用extends 编辑:我不知道FilterTableData 类型,那是接口还是类?答案可能会再次改变,具体取决于类型

【讨论】:

  • 但是如果我想用它作为函数的返回类型呢? const func = ():TableState => .... 但不是 TableState 我想有一些类型来确保它实现 TableState。
  • instanceof 不适用于接口,因为接口没有运行时表示。它们在编译过程中被删除。
  • @IngoBürk 完全忘记了这一点。谢谢!修改了我的答案
猜你喜欢
  • 2016-09-29
  • 1970-01-01
  • 1970-01-01
  • 2011-02-01
  • 2020-11-22
  • 1970-01-01
  • 2010-09-21
  • 1970-01-01
  • 2018-07-26
相关资源
最近更新 更多