将联合类型与泛型一起使用

时间:2020-10-26 20:34:48

标签: typescript

我有一个接受参数的函数,该参数是一个由字段(字符串)和参数(对象文字)组成的对象。

我希望根据字段是什么来验证参数类型检查。我也希望做出一个可以扩展到我需要的地方的定义(因此通用)。

定义:

 export interface EventDefinition<
    TField extends string,
    TArgs extends any
  > {
    field: TField
    arguments: TArgs
  }

我的功能:


export const myFn =  (
  params:
    | EventDefinition<
        'actionOne',
        {
          id: string
        }
      >
    | EventDefinition<
        'actionTwo',
        {
          emailAddress: string
        }
      >
) => {
  const { args, field } = params

  switch(field) {
    case 'actionOne':
      console.log(args.id)
      break;
      case 'actionTwo':
      console.log(args.emailAddress)
      break;
  }
}

虽然field属性验证args不验证并导致错误(例如,使用args.id):

Property 'id' does not exist on type '{ id: string }'.
Property 'id' does not exist on type '{ emailAddress: string; }'.

如何正确定义它?

1 个答案:

答案 0 :(得分:3)

Typescript不会保护基于另一个变量的变量,只是不支持。

如果使用参数本身,则控制流分析可以适当地确定类型

  switch(params.field) {
    case 'actionOne':
      console.log(params.arguments.id)
      break;
      case 'actionTwo':
      console.log(params.arguments.emailAddress)
      break;
  }

Playground Link