打字稿:在对象内推断通用对象的类型

Typescript: Infer type of generic object, within object

我有以下类型:

export type SchemaEntry<A extends object, B> =
  | Validator<B>
  | ((obj: A) => Validator<B>);
export type Schema<A extends object> = { [k in keyof A]: SchemaEntry<A, A[k]> };

以及使用它们的函数:

function foo<A extends object>(f: Schema<A>): A {
  return undefined as any;
}

我的问题是当我调用函数时:

const a = foo({
  b: new Validator<number>(),
  c: (o) => new Validator<number>()
});

o 的类型在这种情况下将是 any 而不是我预期的 {b: number, c: number}。 然而 a 确实接收到正确的类型,{b: number, c: number}

有什么方法可以帮助打字稿推断我的匿名函数的类型吗?

类型推断从参数值流向函数,而不是相反。 foo 看到您传入的参数适用于参数约束,因此允许它,但它不会为您追溯键入未类型化的对象。

想想你是否写过:

const input = {
  b: new Validator<number>(),
  c: (o) => new Validator<number>()
};

const a = foo(input);

调用 foo 后,您不会期望 input 的类型发生变化。

如果你想帮助打字稿理解 o 的类型,你需要通过直接输入来帮助它理解你正在创建的输入对象的严格类型。

这样做还可以让您不明确键入 <number>Validator 泛型,因为这也应该从整体类型中推断出来。

我建议尝试编写我在上面编写的代码,但给它一个特定的类型 const input: <Your_Type_Here> = {...