【问题标题】:Typescript interface with indexer and other properties带有索引器和其他属性的 Typescript 接口
【发布时间】:2017-07-16 23:36:18
【问题描述】:

我正在尝试为 ArangoDB 的服务器端 API 编写定义文件。此 API 公开了一个 db 对象,该对象可用于访问集合,还可以执行数据库级别的操作,例如运行查询。所以我可以打电话:

db['my-collection'] <- returns a collection object

还有:

db._query('some query') <- returns a query cursor

于是我尝试了如下界面:

interface ArangoDatabase {
    [collectionName: string]: ArangoCollection;
    _query(query: string): ArangoCursor;
}

但这对 TS 来说似乎无效,因为它会生成以下错误:

Property '_query' of type '(query: string) => ArangoCursor' is not assignable to string index type 'ArangoCollection'.

注意:我尝试this solution 为索引器指定ArangoCollection|ArangoCursor 类型,但没有帮助。

我是否达到了可以使用接口建模的限制,还是有其他方法?

提前致谢。

【问题讨论】:

    标签: typescript


    【解决方案1】:

    您想使用交叉点类型。试试这个:

    interface ArangoDatabaseIndex {
      [collectionName: string]: ArangoCollection;
    }
    interface ArangoDatabaseQuery {
      _query(query: string): ArangoCursor;
    }
    
    type ArangoDatabase = ArangoDatabaseIndex & ArangoDatabaseQuery;
    

    【讨论】:

    • 可以通过定义文件暴露交集类型吗?
    • @ThomasWeiss 为什么不呢?
    【解决方案2】:

    query 成员的类型是(query: string)=&gt;ArangoCursor,这就是ArangoCollection|ArangoCursor union 不适合你的原因。

    应该是:

    interface ArangoDatabase {
        [collectionName: string]: ArangoCollection|((query: string)=>ArangoCursor);
        _query(query: string): ArangoCursor;
    }
    

    【讨论】:

    • 不错,没想到可以这样
    • 感谢您的更正;我接受了 st_huck 的回答,因为它更符合我正在映射的类型系统。
    猜你喜欢
    • 2019-06-09
    • 2016-02-23
    • 1970-01-01
    • 2015-12-20
    • 2020-02-02
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多