TypeScript中MockStore的select方法泛型T为何被标记为阴影名称?
为什么select方法的泛型T会触发“阴影名称”lint错误?
这个问题的核心是命名作用域的冲突:你的MockStore类已经定义了一个泛型参数T(代表store的状态类型),而select方法里又声明了一个同名的泛型参数<T, R>——方法级别的T会覆盖(也就是“阴影”)类级别的T,这就触发了lint工具的报错。
具体来说:
- 类作用域的
T是整个MockStore的状态类型,作用范围覆盖整个类的所有成员。 - 当你在
select方法里写<T, R>时,这个T是方法自己的泛型参数,它的作用域只在方法内部。但因为和类的T同名,就会“遮蔽”掉外部的那个T,导致代码可读性变差(别人看到方法里的T时,会困惑到底是指类的状态类型还是方法自己的泛型),所以lint工具会把这种情况标记为错误。
怎么解决?
有两种常见的修复方式:
1. 给方法的泛型参数换个不同的名字
比如把方法里的T改成U或者更有语义的名字(比如StateSlice),避免和类的泛型重名:
export class MockStore<T> extends BehaviorSubject<T> { constructor(private _initialState: T) { super(_initialState); } public dispatch = jest.fn(); public select = <U, R>(pathOrMapFn: any, ...paths: string[]): Observable<R> => { return map.call(this, pathOrMapFn); } }
2. 移除方法里多余的T泛型
其实从业务逻辑来看,select方法的输入应该是基于类的状态类型T的,所以你根本不需要在方法里重新声明T。可以直接复用类的T,只声明结果类型R:
export class MockStore<T> extends BehaviorSubject<T> { constructor(private _initialState: T) { super(_initialState); } public dispatch = jest.fn(); public select = <R>(pathOrMapFn: (state: T) => R, ...paths: string[]): Observable<R> => { return map.call(this, pathOrMapFn); } }
这种方式不仅解决了lint错误,还让类型定义更准确——明确了pathOrMapFn是接收类的状态T并返回R的函数。
内容的提问来源于stack exchange,提问作者BlackHoleGalaxy
相关产品推荐
相关产品推荐

