Firebase类型有一个界面agile_ref
,其IQuery
方法的类型为:
equalTo()
我有一个模拟库,它试图模仿Firebase暴露的API表面,但在public equalTo(value: number | string | boolean | null, name?: string): IQuery;
参数的情况下," string"可以更具体:
name
通过陈述 public equalTo(value: number | string | boolean | null, key?: keyof T): IQuery<T>
,我们得到一些非常有用的静态检查,我讨厌丢失,事实上直到TypeScript 2.8.3我似乎能够做到这一点但是当转移到{ {1}} + Typescript我现在得到这个错误:
键入&#39; string&#39;不能分配给&#39;键入&#39;。
对于更多上下文,我的模拟库中的类定义是:
keyof T
2.9.x
泛型类型是查询将返回的数据结构类型的指示符。
此外值得注意的是,T,将永远形成为带字符串键的字典/散列,因此 export default class Query<T = any> implements IQuery<T> { ... }
将是字符串值的子集,但在我的输入中我会&#39;我没有说清楚,所以我得到了打字稿问题的地方......我只是不知道如何表达<T>
必须是一个字符串。
答案 0 :(得分:4)
这与keyof
在2.9中工作方式的变化有关,直到2.9 keyof
仅返回string
个密钥,从2.9开始它将返回number
和{ {1}}键。这是this
要仅接受symbol
个密钥,您可以使用string
作为Extract<keyof T, string>
参数的类型,或者如果您想恢复旧行为,则可以使用key
编译器标志
--keyofStringsOnly
答案 1 :(得分:1)
您还可以要求键入的键只能是字符串:
key?: keyof T & string