typescript - 从记录中排除键

标签 typescript record mapped-types keyof

我有以下通用映射类型:

export type KeyRules<Input> = {
  [K in keyof Input]?: Rule<Input[K], Input>};

我想定义另一个看起来像这样的:

export type ExtendedRules<Input> = Omit<
  Record<string, Rule<Input, Input>>,
  keyof Input
>;

export type ExtendedRules<Input> = {
  [K in Exclude<string, keyof Input>]?: Rule<Input, Input>
};

export type ExtendedRules<Input> = Record<
  Exclude<string, keyof Input>,
  Rule<Input, Input>
>;

然后我将定义第三种类型:

export type Rules = KeyRules & ExtendedRules;

但是我似乎无法排除输入的键。 ExtendedRules<Input>始终等于 Record<string, Rule<Input, Input> .

我还尝试了条件类型:

export type Rules<Input> = {
  [k: string]: k extends keyof Input ? Rule<Input[typeof k], Input> : Rule<Input, Input>
}

这也不起作用

实际上是否可能有一种否定的映射对象类型?

最佳答案

这可能适用于您的用例,也可能不适用于您的用例,但您可以将要省略的键的值类型声明为never,而不是尝试完全删除键。这通常会产生相同的效果。

示例:

type bannedKeys = "a" | "b" | "c"

type myType = {
    [key: string]: string;
} & {
    [key in bannedKeys]: never;
}

declare const obj: myType;

const test1 = obj["a"]; // test1 has type 'never'
const test2 = obj["d"]; // test2 has type 'string'

关于typescript - 从记录中排除键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72589497/

相关文章:

haskell - 解决haskell数据记录中的循环依赖

typescript - 如何输入对应类型的元组数组?

typescript - 关于带有类型推断的映射元组类型的问题

javascript - Angular 2等待 promise 和可观察的解决

typescript - 代码重复检测是否适用于 SonarQube 中的 TypeScript 语言?

typescript - 如何用Jest单元测试覆盖TypeORM @Column装饰器?

reactjs - 在 vscode 中使用 antd 框架的按钮提示

mysql - 如果值与另一个表中的记录值匹配,则更新表记录

redirect - DNS 记录 : admin. *.domain.com => 1.1.1.1 & *.domain.com => 2.2.2.2

TypeScript 映射类型 : Get element type of array