簡體   English   中英

從同級鍵的值推斷對象鍵類型

[英]Infer object key type from sibling key's value

我有一個帶有兩個鍵的對象類型Options

  1. strategy :需要一個未知類型參數的函數
  2. 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.strategybarOptions.parameterbarOptions.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM