如何修改泛型函数defc以触发TypeScript隐式any类型警告?
解决defc函数无法触发隐式any警告的问题
原defc函数的问题出在泛型约束T extends Record<string, any>上——这个约束会告诉TypeScript:传入的对象参数的所有属性都允许是any类型。所以当你解构bar时,TypeScript会自动把bar推断为any,自然不会触发「Binding element 'bar' implicitly has an 'any' type.ts(7031)」警告。
要让警告正常触发,只需要修改泛型约束,不要预设对象属性的类型为any。修改后的defc函数如下:
export function defc<T extends object>(f: (a: T) => void) { return function(a: T) { return f(a) } }
修改说明:
- 把泛型约束从
Record<string, any>改为object,意味着我们只要求T是一个对象类型,但不限制它的属性类型。 - 此时当你写
const foo = defc(function({bar}){...})时,TypeScript无法从上下文推断出bar的具体类型,就会触发预期的隐式any警告。 - 如果需要明确指定参数类型,依然可以通过泛型参数传入,比如
defc<{bar: string}>(function({bar}){...}),此时bar会被推断为string,不会有警告。
内容的提问来源于stack exchange,提问作者yigal
相关产品推荐
相关产品推荐

