如何验证类型 Foo 仅包含类型 Bar 的属性子集?

How to verify that type Foo only contains a subset of properties from type Bar?

我有一个接口,AppState,我希望能够针对这个主应用程序状态接口的一个子集进行编码,这样我就只提取将由控制器填充的属性 class管道。最终我希望能够 "connect" 使用 FooAppStateSubset 以便在开发时我们可以轻松地挑选出相关的道具并为我们网站的当前部分设置。

我怎样才能确保...

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

型号:

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


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

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

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!