TypeScript中如何声明与给定函数参数列表兼容的数组类型
ItemArgs 类型声明实现
type ItemArgs = [tag: string, kind?: string | undefined, name?: string | undefined];
实现说明
该元组类型完全匹配item函数的参数规则:
- 第一个元素为必选
string,对应必传的tag参数 - 第二个、第三个元素为可选的
string | undefined,对应可选的kind、name参数,既支持省略位置,也支持显式传入undefined
如果item函数的参数已显式声明可选参数类型为string | undefined,也可以直接通过工具类型自动生成,效果等价:
// 假设item函数的签名为 (tag: string, kind?: string | undefined, name?: string | undefined) => string type ItemArgs = Parameters<typeof item>;
编译约束验证
1. block函数map调用验证
定义block函数:
function block(...items: ItemArgs[]) { // 若item为解构数组参数的形式,直接传item即可 return items.map(item); // 若item为分离位置参数的形式,展开元组调用即可,同样可正常编译 // return items.map(args => item(...args)); }
所有ItemArgs类型的元组都能完全匹配item的入参要求,因此map调用不会出现类型错误。
2. 调用参数兼容性验证
两种示例传参均可以正常通过编译:
block(['property', 'boolean', 'should']):三个元素均为string,符合元组类型约束block(['property', undefined, 'something']):第二个元素显式传入undefined,符合kind位置的string | undefined类型要求
关键注意点
如果开启了exactOptionalPropertyTypes严格编译选项,仅写kind?: string会禁止显式传入undefined(仅允许省略该位置参数)。显式标注string | undefined后,无论是否开启该严格规则,都能满足显式传undefined的需求。
内容的提问来源于stack exchange,提问作者Szczepan Hołyszewski
相关产品推荐
相关产品推荐

