打字稿:在对象

时间:2018-04-09 16:34:44

标签: typescript generics types type-inference

我有以下类型:

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}

有没有办法可以帮助打字稿来推断我的匿名函数的类型?

1 个答案:

答案 0 :(得分:1)

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

考虑一下你是否写过:

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

const a = foo(input);

调用foo后,您不会期望更改input的类型。

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

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

我建议您尝试编写上面编写的代码,但要为其指定特定类型<number>