【问题标题】:Typescript | How to avoid namespace and main library interface name collision?打字稿 |如何避免命名空间和主库接口名称冲突?
【发布时间】:2020-07-16 17:03:17
【问题描述】:

假设我正在用 javascript 编写一个带有 typescript 声明文件的库,并且我想通过接口创建库实例的“形状”,如下所示:

export interface Library {
  foo: string;
  bar: string;
}

现在假设 foobar 类型会更复杂,我想将其执行为不同的类型别名,例如:

export type ID = string | number;

export interface Library {
  foo: ID;
  bar: ID;
}

现在我想给ID 一些意义(因为“id”没有说明任何事情),我认为我能做到这一点的唯一方法是将它移动到不同的命名空间,这本质上应该被命名为库 - “库”:

export namespace Library {
  export type ID = string | number;
}

export interface Library {
  foo: Library.ID;
  bar: Library.ID;
}

虽然它有效,但它令人困惑和模棱两可,因为一次导入会同时是两种不同的东西

我该如何解决这个问题?也许有一些命名技巧?

【问题讨论】:

    标签: typescript naming


    【解决方案1】:

    这并没有错:

    export type ID = string | number;
    
    export interface Library {
      foo: ID;
      bar: ID;
    }
    

    请记住,您的库中的所有内容都必须从您的库中显式导入才能使用。当你这样做时,如果这对正在执行导入的代码很重要,你可以重命名导入。

    import { Library, ID as LibraryID } from 'library'
    
    // Locally defined ID that is different somehow
    interface ID = { _id: number, cacheKey: string } // or whatever
    
    const localId: ID = { _id: 123, cacheKey: 'qwerty' }
    const libId: LibraryID = 123
    

    在大多数打字稿代码编辑器中,您可以 cmd/ctrl 单击类型以跳转到该定义。这会跳转到你的库,并且很清楚类型来自哪里。

    大多数高配置库不会将其类型隐藏在任何命名空间中。例如:

    import { Reducer } from 'react'
    

    React 不关心你是否有其他名为 Reducer 的类型。但是如果你这样做了,你可以很容易地在你自己的文件中更改它的本地名称,如上所述。


    TL;DR:我认为您正在尝试解决一个实际上并不存在的问题。

    【讨论】:

    • 谢谢,我最初从我想避免手动导入别名的问题中删除,即import { ID as LibraryID } from 'library',但是是的,你给了我一些信心,我认为这并不是什么大不了的事。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多