[英]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.