[英]Infer object key type from sibling key's value
我有一个带有两个键的对象类型Options
:
strategy
:需要一个未知类型参数的函数parameter
:与strategy
的第一个参数相同的类型我希望能够做到以下几点
type FooParameter = { foo: string }
type BarParameter = { bar: string }
const fooOptions: Options = {
strategy: (parameter: FooParameter) => {},
parameter: { foo: 'foo' }
}
const barOptions: Options = {
strategy: (parameter: BarParameter) => {},
parameter: { bar: 'bar' }
}
类型fooOptions.parameter
应该从fooOptions.strategy
和barOptions.parameter
从barOptions.strategy
推断
今天的 TypeScript 有可能实现吗?
我能想象到的唯一方法是使用泛型类型。 我认为不太可能有一个解决方案,编译器会在不使用泛型类型的情况下检查该parameter
是否是strategy
的合适参数。
type Options<T> = {
strategy: (parameter: T) => void,
parameter: T
}
这意味着如果在类型注释中使用了Options
,那么您必须提供一个类型参数:
const fooOptions: Options<FooParameter> = {
strategy: (parameter: FooParameter) => {},
parameter: { foo: 'foo' }
}
function useOptions<T>(o: Options<T>): void {
o.strategy(o.parameter);
}
但是,在允许编译器推断类型的任何地方(即,无论何时不使用类型注释),都没有必要为泛型类型参数提供显式类型。 特别是,像useOptions
函数这样的 API 的用户可以传递一个对象字面量,并享受类型检查和类型推断的好处:
useOptions({
strategy: param => {
let x = param.x; // Inferred as number
let y = param.y; // Inferred as string
// Error: Property 'z' does not exist on type '{ x: number, y: string }'
let z = param.z;
},
parameter: { x: 1, y: 'foo' }
});
请注意,此示例中的用户不必显式编写{ x: number, y: string }
或等效类型来使用 API。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.