使用从TypeScript函数中的union参数推断的类型

y4ekin9u  于 2023-02-13  发布在  TypeScript
关注(0)|答案(1)|浏览(167)

具有固定属性名的给定类型定义,如

type Animals =
  | {
      key: 'dog';
      value: { woof: string };
    }
  | {
      key: 'cat';
      value: { meow: number };
    }

我如何构造一个函数参数,以保证在编译时只向一个类型传递正确的参数?我想像这样调用我的函数:

fn('dog', { woof: 'woof' });
fn('cat', { meow: 'meow' });

但在编译时以下操作将失败

fn('dog', { meow: 'meow' });
fn('cat', { woof: 'woof' });

我尝试了const fn = <T extends Animals>(key: T['key'], value: Extract<T, { key: T['key'] }>['value']) => ...,但是值类型仍然是联合类型{ woof: string } | { meow: number },而不是基于键参数的独占{ woof: string }{ meow: number }

hc2pp10m

hc2pp10m1#

找到办法了!公平地说我不确定这是否可行!

type Value<TKey, TAnimal extends Animals> = TAnimal extends { key: TKey, value: infer TValue } ? TValue : never;

function fn<TKey extends Animals['key'], TAnimal extends Animals>(key: TKey, value: Value<TKey, TAnimal>) {
   // Your code here
}

看看这个Playground。

相关问题