【问题标题】:How to enforce object type with interface property - value如何使用接口属性强制对象类型 - 值
【发布时间】:2019-07-09 13:42:56
【问题描述】:

我有这个界面

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'.

对这个主题有任何帮助吗?

【问题讨论】:

  • 不确定你在问什么。您希望如何使用fieldType?此外,类型应为 TitleCase 以保持一致性
  • 字段对象是否应该恰好有一个来自SUser的键/值对?它应该有至少一个来自SUser 的键/值对吗?展示您希望成功的对象示例(例如,const good: fieldType = {...};)和您希望失败的对象示例(例如,const bad: fieldType = {...} // error!)对您来说非常有用。
  • 穆拉特成功回答了我的问题!还要感谢 Juan 的类型命名信息 :)
  • type fieldType = Partial<SUser> 将允许来自SUser 的任意数量的属性。这意味着const x: fieldType = {}(零属性)和const y: fieldType = {ID: 1, NAME: "x"}(两个属性)都将编译。这真的是你想要的吗?

标签: typescript


【解决方案1】:

你会这样使用它

type fieldType = Partial<SUser>;

【讨论】:

  • 这和Partial&lt;SUser&gt;不一样吗?
  • 不知道 Partial 实用程序类型,谢谢 :)
  • 部分和您之前拥有的(我在回答中拥有的)不是一回事。 Partial 使所有属性都是可选的。这可能是 OP 想要的,但问题还不够清楚,因为它没有显示它将如何使用。
【解决方案2】:

要编译你的代码,你可以这样做:

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

【讨论】:

    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-21
    • 2017-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多