你怎么能表达"关键的T"成为String的子集?

时间:2018-06-02 05:11:25

标签: typescript

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>必须是一个字符串。

2 个答案:

答案 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