Firebase的类型具有IQuery接口(interface),该接口(interface)的equalTo()方法键入为:

public equalTo(value: number | string | boolean | null, name?: string): IQuery;

我有一个模拟库,该库试图模仿Firebase所暴露的API表面,但是在name参数的情况下,可以使“字符串”的常规键入更为具体:
 public equalTo(value: number | string | boolean | null, key?: keyof T): IQuery<T>

通过声明keyof T,我们得到了一些非常有用的静态检查,我不想错过它,实际上直到TypeScript 2.8.3为止,我似乎都能做到这一点,但是当转到Typet的2.9.x +时,我现在得到此错误:



为了获得更多上下文,我的模拟库中的类定义为:
 export default class Query<T = any> implements IQuery<T> { ... }

其中<T>泛型类型是查询将返回的数据结构类型的指示符。

进一步值得注意的是,T将始终被塑造为带有字符串键的字典/哈希,因此keyof T将成为字符串值的子集,但是在我的打字过程中我并没有明确说明,所以我知道Typescript在哪里出现问题...我只是不知道如何表达keyof T必须是字符串。

最佳答案

这与keyof在2.9中的工作方式的变化有关,直到2.9 keyof仅返回string key 为止,从2.9开始,它将返回numbersymbol key 。这是this的引用

要仅接受string key ,可以将Extract<keyof T, string>用作key参数的类型,或者如果要还原为旧的行为,则可以使用--keyofStringsOnly编译器标志

public equalTo(value: number | string | boolean | null, key?: Extract<keyof T, string>): IQuery<T>

09-25 16:23