例如,我有
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)
要扩展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。
创建一个助手类型:
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)
目前不支持此功能。TypeScript 需要一个减法类型的概念。提案存在https://github.com/Microsoft/TypeScript/issues/12215和https://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)
| 归档时间: |
|
| 查看次数: |
2675 次 |
| 最近记录: |