当前位置: 首页 > 知识库问答 >
问题:

TypeScript:具有一个必填字段的接口的泛型

松德曜
2023-03-14

我想创建一个函数f,它接受一个字符串,并创建一个对象,其中key是唯一的字段集。

我还希望该函数能够对接口A进行类型检查,以确保键字段是对象上唯一必需的字段。(将有其他可选字段)。

问题:

是否可以表达类型A,以便函数f有效-并且不会产生类型错误-并且在使用时仍然正确键入A

export function f<A extends { key: string }>(key: string): A {
  return { key }; // This produces compile error TS2322: (see below)
}

// This be a few different interfaces, but they all have in common that
// the key-field is the only required field.
interface WithKey {
  key: string;
  ignoreMe?: string;
}

const result = f<WithKey>('myKey');

编译器错误:

TS2322:类型“{key: string;}”不能分配给类型“A”。

共有1个答案

夏俊杰
2023-03-14

问题是,您的语句表示它接受的类型必须具有字符串的键,并且将返回该类型。

这意味着如果我经过那里

js prettyprint-override">{key: 1, requiredField: 5}

它返回与我的requiredField相同的类型。

但是实现返回{key}会破坏此语句,因为它不再返回必需字段。这会导致TS2322。

一个可能的解决方案-简单地说界面你返回。

export function f(key: string): { key: string } { // <- return type
  return { key };
}

interface WithKey {
  key: string;
  ignoreMe?: string;
}

const result: WithKey = f('myKey');

result.key; // works
result.ignoreMe // works (undefined)
 类似资料:
  • 问题内容: 我想知道模式草案03是否可行。我已经在其他地方使用了依赖项,我认为可能需要创造性地使用它们,以便使用它们来指定某些字段的属性。 我目前的最佳尝试(无效)将使您对我的追求有所了解。我想要一个默认值,当另一个字段具有特定值时是可选值。 问题答案: 草案的第3版绝对可以做到这一点。由于您具有允许的国家/地区的完整列表,因此您可以执行以下操作: 因此,您实际上为架构定义了两种子类型,一种用于需

  • 问题内容: 我有一个表格,其中的两个字段根据需要在我不希望出现时也出现。这是来自models.py的表格 在实际的电路模型中,字段的定义如下: 我的views.py在这里: 我该怎么做,以便不需要这两个字段? 问题答案: 如果您不想修改模型中字段的空白设置(这样做会破坏管理站点中的常规验证),则可以在Form类中执行以下操作: 重新定义的构造函数不会损害任何功能。

  • 问题内容: 有一个表格,其中的两个字段在我也不希望出现时按要求列出。这是来自models.py的表格 我的views.py在这里: 我该怎么做,以便不需要这两个字段? 问题答案: 如果你不想修改模型中字段的空白设置(这样做将破坏管理站点中的常规验证),则可以在Form类中执行以下操作: 重新定义的构造函数不会损害任何功能。

  • 问题内容: 好的,这是我的问题: 我有一个包含interfaces的列表-和扩展该接口的接口的列表:。我要设置。我不希望使用任何东西或会花费更多内存的东西,因为我正在做的事情已经非常耗费成本。我确实需要能够说。我已经尝试过,但是后来我无法将接口添加到列表中,只能将SubInterfaces 添加到列表中。有什么建议? 我希望能够做这样的事情: RecordKeeper类是包含接口列表的类(NOT

  • 下面是我试图做的一个非常简单的说明: 最后一个方法调用(consumer.consumer())给了我一个编译器错误 Out projected type’EventConsumer 我知道Kotlin对泛型的要求比Java严格得多,这可能就是它不起作用的原因,但我该如何正确地实现这样的东西呢?

  • 问题内容: 我想在嵌套的静态接口中使用泛型类。我的目标是做这样的事情: 但是我得到一个错误:无法对非静态类型T进行静态引用。如果进行一些更改(如下所述),我可以在接口内部使用泛型,但是我想避免使用此方法,因为编写同一个类两次:一次用于MyClass,一次用于MyInterface。 谢谢。 编辑 :我想这样做: 要么 问题答案: 静态嵌套类或嵌套接口(顺便说一句,始终是静态的)与其外部类(或接口)