TypeScript如何约束泛型函数参数为合法的嵌套属性名
这个需求完全可以实现,通过TypeScript的泛型约束和索引类型就能实现你要的参数类型校验效果,修改后的函数定义如下:
function getFieldPath<T, K extends keyof T, P extends keyof T[K]>(fieldA: K, fieldB: P): string { return `${fieldA as string}.${fieldB as string}`; }
类型说明
- 泛型
T是传入的根类型,对应你示例中的Hero、Monster - 泛型
K被约束为T的一级键,对应参数fieldA,确保只能传入T的合法一级属性 - 泛型
P被约束为T[K]的键,对应参数fieldB,确保只能传入fieldA对应属性下的合法子属性
校验效果完全符合你的预期
getFieldPath<Monster>('stat', 'str'):类型校验通过,无报错getFieldPath<Monster>('stat', 'int'):TypeScript抛出类型错误,提示int不是Monster['stat']的合法属性getFieldPath<Hero>('stat', 'str'):TypeScript抛出类型错误,提示str不是Hero['stat']的合法属性getFieldPath<Hero>('stat', 'int'):类型校验通过,无报错
内容的提问来源于stack exchange,提问作者Maslow
相关产品推荐
相关产品推荐

