我有一个接受参数的函数,该参数是一个由字段(字符串)和参数(对象文字)组成的对象。
我希望根据字段是什么来验证参数类型检查。我也希望做出一个可以扩展到我需要的地方的定义(因此通用)。
定义:
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; }'.
如何正确定义它?
答案 0 :(得分:3)
Typescript不会保护基于另一个变量的变量,只是不支持。
如果使用参数本身,则控制流分析可以适当地确定类型
switch(params.field) {
case 'actionOne':
console.log(params.arguments.id)
break;
case 'actionTwo':
console.log(params.arguments.emailAddress)
break;
}