TypeScript:从类型/减法类型中删除键

Leigh Brenecki:

我想定义一个ExcludeCart<T>基本类型T但要cart删除给定键(在我的情况下为的通用类型所以,举例来说,ExcludeCart<{foo: number, bar: string, cart: number}>将是{foo: number, bar: string}有没有办法在TypeScript中做到这一点?

这就是为什么我要这样做的原因,以防万一我弄错了树:我正在将现有的JavaScript代码库转换为TypeScript,其中包含一个称为Decor的装饰器函数,该函数cartify接受React组件类Inner并返回另一个组件类Wrapper

Inner应该带一个cart道具,以及零个或多个其他道具。Wrapper接受cartClient道具(用于生成cart要传递给道具Inner),以及Inner接受的任何道具除外) cart

换句话说,一旦我想出了如何定义ExcludeCart,就可以使用它来做到这一点:

function cartify<P extends {cart: any}>(Inner: ComponentClass<P>) : ComponentClass<ExcludeCart<P> & {cartClient: any}>
阿德里安·莱昂哈德(Adrian Leonhard):

虽然没有内置的减法类型,但是您现在可以将其入侵:

type Sub0<
    O extends string,
    D extends string,
> = {[K in O]: (Record<D, never> & Record<string, K>)[K]}

type Sub<
    O extends string,
    D extends string,
    // issue 16018
    Foo extends Sub0<O, D> = Sub0<O, D>
> = Foo[O]

type Omit<
    O,
    D extends string,
    // issue 16018
    Foo extends Sub0<keyof O, D> = Sub0<keyof O, D>
> = Pick<O, Foo[keyof O]>

在问题的情况下,您可以执行以下操作:

type ExcludeCart<T> = Omit<T, 'cart'>

使用TypeScript> = 2.6,可以将其简化为:

/**
 * for literal unions
 * @example Sub<'Y' | 'X', 'X'> // === 'Y'
 */
export type Sub<
    O extends string,
    D extends string
    > = {[K in O]: (Record<D, never> & Record<string, K>)[K]}[O]

/**
 * Remove the keys represented by the string union type D from the object type O.
 *
 * @example Omit<{a: number, b: string}, 'a'> // === {b: string}
 * @example Omit<{a: number, b: string}, keyof {a: number}> // === {b: string}
 */
export type Omit<O, D extends string> = Pick<O, Sub<keyof O, D>>

在操场上测试

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何从TypeScript中的类型化对象中动态删除键

在 Typescript 中删除对象键并返回条件类型

Go中的类型和减法

Typescript中的对象索引键类型

TypeScript中的键和值类型

TypeScript:将Map中的键用作类型

类型“键”不能用于索引 TypeScript 中的类型“对象”

根据 TypeScript 中的查找类型限制通用键类型

从 Typescript 中的自动生成类型中删除 []

是否可以在TypeScript类型和通用键类型中混合使用特定类型的键?

typescript如何从类型中解开/删除Promise?

如何从联合类型中删除较宽的类型而不在TypeScript中删除其子类型?

TypeScript - 基于类型对象在函数 sig 中映射键类型与值类型

索引类型的TypeScript键太宽

返回特定类型的TypeScript键

如何从Hive映射类型中删除特定键?

来自Typescript中对象的键和值的类型

TypeScript中是否可以直接从对象的键创建新类型?

在TypeScript中按值类型排除对象键

TypeScript-强制对象中特定键的类型

如何从Typescript中的固定对象的键创建映射类型

如何在TypeScript界面中强制输入键类型?

在 TypeScript 中通过键获取 Object 类型的值

如何在 TypeScript 中为函数类型添加键?

TypeScript中具有通用每个键的映射对象类型

如何通过 TypeScript 中的键匹配更改属性类型

Typescript-排除参数中其他类型的键

如何在TypeScript中返回接口键类型?

是否可以将 Map 键提取为 TypeScript 中的类型?