【问题标题】:How to verify that type Foo only contains a subset of properties from type Bar?如何验证 Foo 类型仅包含 Bar 类型的属性子集?
【发布时间】:2020-02-02 07:22:31
【问题描述】:

我有一个接口 AppState,并且我希望能够针对这个主 appstate 接口的一个子集进行编码,以便我只提取将由管道中更远位置的控制器类填充的属性。最终,我希望能够使用 FooAppStateSubset “连接”,因此在开发时我们可以轻松地挑选出相关的道具,并为我们当前的网站部分设置。

我怎样才能确保...

  1. FooAppStateSubset ONLY 包含在 AppState 接口中也可以找到的属性和值
  2. FooAppStateSubset 不需要列出来自 AppState 的非可选参数
  3. 如果前两条规则被破坏,编译和构建时会失败
  4. 属性的自动完成将是一个很酷的奖励。好吧,如果这是不可能的。
  5. 能够在整个网站上定义模型,而不需要让主 AppState 接口实现所有分散的子集模型,那就太好了。

型号:

interface AppState {
  email: string;
  userId: number;
  firstName?: string;
  isAwesome: boolean;
}


interface/type FooAppStateSubset {
  isAwesome: boolean;
  firstName?: string;
}

【问题讨论】:

标签: typescript interface react-redux polymorphism redux-store


【解决方案1】:

如果您只有几个属性,最简单的方法是:

type FooAppStateSubset = Omit<Omit<AppState, 'email'>, 'userId'>

否则可能是类型保护?

function isSubset(something: AppState | FooAppStateSubset): something is FooAppStateSubset {
  return !('email' in something || 'userId' in something);
}

const foo = { isAwesome: true };
isSubset(foo) && console.log(foo.email); // error!

【讨论】:

  • 我喜欢使用类型保护的想法,因为您应该能够将其设置为可重用且更加自动化。必须指定一大串属性会很麻烦。我仍然希望有编译时警告或某种错误。这将在运行时发出警告。我想运行时警告总比没有警告好。我可以通过检查它是否是 localhost 来让它变得超级烦人,如果 localhost 会弹出一个文字警告框来警告开发人员。
  • 请注意,Omit&lt;Omit&lt;T, K1&gt;,K2&gt; 是Omit&lt;T, K1|K2&gt; 的一种更复杂的表达方式。
猜你喜欢
  • 1970-01-01
  • 2021-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多