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

标签 typescript object types

我有以下场景。

function foo<A extends object, B extends A>(
  a: A,
  b: Pick<B, Exclude<keyof B, keyof A>>
): B {
  return undefined as any;
}

const r = foo<{ a: string }, { a: string; b: number }>({ a: "" }, { b: 2 });

我希望 b 成为一个对象,它只包含不在 a 中的键。但我也想在将它们合并在一起时获得结果对象的类型。

最佳答案

这可以通过使用 Exclude 来实现在键上,然后使用 Pick 创建最终对象类型在那些过滤后的键上:

function foo<A extends object, B extends A>(
    a: A,
    b: Pick<B, Exclude<keyof B, keyof A>>,
): B {
  return undefined as any;
}

再解释一下:

type A = { a: string };
type B = { a: string; b: number };

// "b"
type FilteredProps = Exclude<keyof B, keyof A>;
// { b: number; }
type FinalType = Pick<B, FilteredProps>;

为什么Exclude<B, Pick<B, keyof A>>的原因不工作是因为:

// { a: string; }
type PickedObject = Pick<B, keyof A>;
// never, because { a: string; b: number; } extends { a: string; }
type FinalType = Exclude<B, PickedObject>;

// for reference...
type Exclude<T, U> = T extends U ? never : T;

关于Typescript - 在参数中排除其他类型的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49707496/

相关文章:

javascript - 如何通过ajax使用默认对象填充选择

php - 让 mysql_fetch_assoc 自动检测返回数据类型?

scala - Scala 语言规范中术语 "substitution"的定义是什么?

angularjs - 如何摆脱<引用路径=

reactjs - react typescript : TS Error when using useReducer

javascript - 使用 redux connect 函数会丢失 IDE 中的类信息 (PhpStorm/WebStorm)

c# - 将 Null 值分配给 DataTable 中的整数列

javascript - 等待一组可观察的订阅函数完成

java - 如何找到对象的类型然后相应地工作?

ruby - 在 Ruby 中用单 '@' 和双 '@' 声明对象的区别