如何使用接口属性强制对象类型-值

时间:2019-07-09 13:42:56

标签: typescript

我有这个界面

interface SUser {
  ID: number;
  NAME: string;
  MAIL: string;
  PASSWORD: string;
  GENDER: number;
  BIRTHDATE: string;
  ID_FB: string;
  CREDIT: number;
  ID_REFERRAL: number;
}

我想要一种描述对象的类型,并确保我的对象与我的接口属性之一的键和值匹配。

我尝试了以下方法:

type fieldType = { [K in SUser]: string | number };

我将字段对象设置为仅允许SUser允许键,但是如果将值设置为字符串(例如,键为ID),则想得到一个错误。

基本上我想基于我的界面来强制执行键-值对。

使用前面的代码,我得到以下错误,并且不强制使用值类型:

Type 'SUser' is not assignable to type 'string | number | symbol'.
  Type 'SUser' is not assignable to type 'symbol'.

对此主题有任何帮助吗?

2 个答案:

答案 0 :(得分:1)

您会这样使用它

db.aggregate

答案 1 :(得分:0)

要编译代码,请执行以下操作:

type fieldType = { [K in keyof SUser]: string | number };

但是我不确定您将如何使用它,因为它将扩展为:

type fieldType = {
  ID: string | number;
  NAME: string | number;
  MAIL: string | number;
  PASSWORD: string | number;
  GENDER: string | number;
  BIRTHDATE: string | number;
  ID_FB: string | number;
  CREDIT: string | number;
  ID_REFERRAL: string | number;
}

这不会给您您想要的错误。

您可能希望使用Partial<SUser>创建一个所有属性均为可选的类型

type fieldType = {
  ID?: number;
  NAME?: string;
  MAIL?: string;
  PASSWORD?: string;
  GENDER?: number;
  BIRTHDATE: string;
  ID_FB?: string;
  CREDIT?: number;
  ID_REFERRAL?: number;
}

我假设这是因为您希望在某些情况下传递属性的子集,但在其他情况下,则需要完整的字段。参见TypeScript partial interface object