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开始,它将返回number
和symbol
key 。这是this的引用
要仅接受string
key ,可以将Extract<keyof T, string>
用作key
参数的类型,或者如果要还原为旧的行为,则可以使用--keyofStringsOnly
编译器标志
public equalTo(value: number | string | boolean | null, key?: Extract<keyof T, string>): IQuery<T>