打字稿 |如何避免命名空间和主库接口名称冲突?
Typescript | How to avoid namespace and main library interface name collision?
假设我在 javascript 中使用打字稿声明文件编写一个库,并且我想通过接口创建库实例的“形状”,如下所示:
export interface Library {
foo: string;
bar: string;
}
现在假设 foo
和 bar
类型会更复杂,我想将其执行到不同的类型别名,例如:
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:我认为您正在尝试解决一个实际上并不存在的问题。
假设我在 javascript 中使用打字稿声明文件编写一个库,并且我想通过接口创建库实例的“形状”,如下所示:
export interface Library {
foo: string;
bar: string;
}
现在假设 foo
和 bar
类型会更复杂,我想将其执行到不同的类型别名,例如:
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:我认为您正在尝试解决一个实际上并不存在的问题。