打字稿|如何避免名称空间和主库接口名称冲突?

时间:2020-07-16 17:03:17

标签: typescript naming

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

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;
}

尽管有效,但令人困惑和模棱两可,因为一次导入将同时是两种不同的事物

我该如何解决?也许有一些提示?

1 个答案:

答案 0 :(得分: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'

如果您有其他名为Reducer的类型,React无关紧要。但是,如果这样做,您可以按照上述方法在自己的文件中轻松更改其本地名称。


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