我有两个接口,XY.X有两个属性,x1x2.现在Y人想继承X人,但不想继承x2人.

interface X {
  x1 : string;
  x2 : string;
}

interface Y extends X{
  // x2 shouldn't be available here
}

作为TypeScript岁的新人,我无法理解.TypeScript中是否有extends X without x1型内置功能?

注意:在我的真实 case 中,X是一个内置的interface.所以,我需要在不改变X接口的情况下完成这项工作.可能吗?

推荐答案

打字脚本>3.5

TypeScript 3.5引入了Omit helper类型,它创建了一个新类型,其中包含从原始类型中删除的一些属性.docs人中的例子:

type Person = {
    name: string;
    age: number;
    location: string;
};

type QuantumPerson = Omit<Person, "location">;

// equivalent to
type QuantumPerson = {
    name: string;
    age: number;
};

Thanks to 100 for the update on Typescript 3.5!

打字脚本>2.8

这可以使用Typescript 2.1和2.8中引入的PickExclude类型来实现:

/**
 * From T pick a set of properties K
 */
type Pick<T, K extends keyof T> = {
    [P in K]: T[P];
};

/**
 * Exclude from T those types that are assignable to U
 */
type Exclude<T, U> = T extends U ? never : T;

使用这些类型定义,您可以构造Omit<T,K>以从泛型类型中省略特定属性:

/**
 * From T pick all properties except the set of properties K
 */
export type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;

要说明Typescript中不包含此类型的原因,请执行以下操作:

我们没有包括省略类型,因为它写得很简单

虽然Typescript中没有包含它,但有几个库提供了自己的similar Omit类型,包括react-reduxMaterial-UI.

Here is a working example:

interface X {
  x1: string;
  x2: string;
}

type Y = Omit<X, 'x2'>;

let x: X = {
  x1: 'string1',
  x2: 'string2'
}

let y: Y = {
  x1: 'string1'
}

Example of Omit

请注意,将选中要排除的属性,排除未在指定类型中定义的属性是错误的:

Example of Omit using non-existent property name

Typescript相关问答推荐

当两个参数具有相同的通用类型时,如果没有第一个参数,则递减约束默认会导致第二个参数的错误推断

带脉轮UI的TypScript支持StyleProps的正确方法是什么?

为什么当我试图从数据库预填充时,属性x不存在于类型{错误:字符串; }.ts(2339)上?

如何使用Generics保留构造函数的类型信息?

Typescript:将内部函数参数推断为子对象键的类型

React组件数组及其props 的类型定义

等待的R没有用响应对象展开到R

找不到带名称的管道''

在TypeScript中,除了映射类型之外还使用的`in`二进制运算符?

使用ngrok解析Angular 时出现HTTP故障

如何在单击停止录制按钮后停用摄像机?(使用React.js和Reaction-Media-Recorder)

对扩展某种类型的属性子集进行操作的函数

打印脚本中的动态函数重载

Angular NgModel不更新Typescript

使用Dockerfile运行Vite React应用程序时访问env变量

记录键的泛型类型

有没有可能产生输出T,它在视觉上省略了T中的一些键?

为什么Typescript不能推断类型?

类型与泛型抽象类中的类型不可比较

如何通过nx找到所有受影响的项目?