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

Typescript | How to avoid namespace and main library interface name collision?

假设我在 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;
}

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

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

这没有错:

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

在大多数 typescript 代码编辑器中,您可以 cmd/ctrl 单击一个类型跳转到该定义。这将跳转到您的库,并且类型的来源非常清楚。

大多数高级库不会将它们的类型隐藏在任何名称空间中。例如:

import { Reducer } from 'react'

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


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