如何在TypeScript中覆盖类型属性

Eug*_*aev 4 typescript

例如,我有

type Line = {
  start: Point;
  end: Point;
  color: string; //'cyan'/'aquablue'/...
}
Run Code Online (Sandbox Code Playgroud)

但是现在我想在Line的基础上创建新的线型,以便将颜色存储为数字:

type HexColorLine = Point & {
  color: number;
}
Run Code Online (Sandbox Code Playgroud)

现在我希望HexColorPoint类型等于

{
  start: Point;
  end: Point;
  color: number;
}
Run Code Online (Sandbox Code Playgroud)

但这等于

{
  start: Point;
  end: Point;
  color: string | number;
}
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以使用一些简短的语法覆盖但不扩展prop类型?我真的需要为此定义全新的类型吗?

小智 22

从 TypeScript 3.5 开始,一个简单的一次性解决方案可能是:

type HexColorLine = Omit<Line, 'color'> & {
  color: number;
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*ter 12

在 TypeScript 3.5 或更高版本中,您可以使用Omit<Type, Keys>.

对于类型:

type HexColorPoint = Omit<Line, "color"> & {
    color: number;
}
Run Code Online (Sandbox Code Playgroud)

对于接口:

interface HexColorPoint extends Omit<Line, "color"> {
    color: number;
}
Run Code Online (Sandbox Code Playgroud)


jos*_*ant 8

要扩展Pablo使用 Omit 的答案,您可以执行以下操作来创建更通用的实用程序类型。

type Overwrite<Base, Overrides> = Omit<Base, keyof Overrides> & Overrides


type HexColorLine = Overwrite<Line, { color: number }>
Run Code Online (Sandbox Code Playgroud)

Overrides这会从类型中省略所提供类型中的所有键Base,然后将其与所提供的组合起来Overrides


Kar*_*ski 6

创建一个助手类型:

type Overwrite<T, U> = Pick<T, Exclude<keyof T, keyof U>> & U;
Run Code Online (Sandbox Code Playgroud)

用法:

type HexColorLine = Override<Line, { color: number }>
Run Code Online (Sandbox Code Playgroud)

  • 今天可以将其写为“type Overwrite&lt;T, U&gt; = Omit&lt;T, keyof U&gt; &amp; U;” (9认同)

bas*_*rat 5

目前不支持此功能。TypeScript 需要一个减法类型的概念。提案存在https://github.com/Microsoft/TypeScript/issues/12215https://github.com/Microsoft/TypeScript/issues/4183

使固定

创建一个基本类型:

type LineBase = {
  start: Point;
  end: Point;
}
type LineBase = LineBase & {
  color: string; //'cyan'/'aquablue'/...
}
Run Code Online (Sandbox Code Playgroud)