打字稿:从通用接口中省略 属性

Typescript: Omit property from a generic interface

我正在尝试创建一个从给定类型中省略 属性 的接口。为此,我使用了 Omit ,它导致 Type 所以它的定义是错误的。但是,如果它不是一个通用接口,它就可以完美地工作。

考虑以下示例。

interface IBaseType {
  prop1: number;
  prop2: string;
  match: boolean;
}

interface OmitMatchNoGeneric extends Omit<IBaseType, "match"> {}

interface OmitMatch<T extends { match: any }> extends Omit<T, "match"> {}

function test(genericArg: OmitMatch<IBaseType>, nonGenericArg: OmitMatchNoGeneric) {
  nonGenericArg.prop1 = 5; // the properties are suggested
  genericArg.prop1 = 5; // intelliSense fails to list the properties
}

在此示例中,VSCode 的智能感知显示了非通用参数的属性列表,但它无法为通用参数执行此操作。通用参数被视为任何类型的对象。

我主要担心的是如果我不应该使用 Omit 我还能使用什么?如果我想用类型而不是接口来实现它,我该怎么做?

TypeScript 在您的通用接口上给您一个错误:

An interface can only extend an object type or intersection of object types with statically known members.

这就是它不起作用的原因。 (见错误on the playground。)

您可以改用类型:

type OmitMatch<T extends { match: any }> = Omit<T, "match">;

一切正常。 (On the playground.)