打字稿:从通用接口中省略 属性
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.)
我正在尝试创建一个从给定类型中省略 属性 的接口。为此,我使用了 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.)