【问题标题】:TypeScript - Using predefined names for custom class namesTypeScript - 为自定义类名使用预定义的名称
【发布时间】:2021-08-29 07:43:57
【问题描述】:

我们可以使用 TypeScript 中的预定义名称来命名自定义类/接口吗? 如果自定义类名称与 TypeScript 中的预定义名称冲突,是否存在可能导致错误的用例?

例如 - 我可以创建一个名为 RequestInfo 的自定义类,而 TypeScript 已经有一个 RequestInfo 类型 -> type RequestInfo = Request | string;

【问题讨论】:

  • 当我将 Discord.js 与 Typescript 一起使用时,我遇到了关于自定义类型的错误,当 Discord,js 自定义类型为例如 GuildMember 我将变量类型传递为 GuildMember | undefined | null 我收到错误"GuildMember isn't assignable to Type undefined"GuildMember isn't assignable to Type null 这很奇怪,因为我已经通过了我遇到的所有类型的错误

标签: typescript naming


【解决方案1】:

您不能将 TypeScript 中的任何预定义名称用作自定义类/接口/类型。原因是类声明创建了一个constructor function as well as a type definition。这意味着我可以这样做:

class Hero {}
const myHero: Hero = new Hero();
const somethingElse: Hero & string = '';

因此,当您尝试重新定义预定义类型时,TypeScript 编译器会发出错误,因为类型通常是为类生成的。

但是,如果您想在模块中声明多个接口,TypeScript 将使用 declaration merging 概念,它将两个接口合并为一个。

interface Hero { x!: number; }
interface Hero { y!: number; }

【讨论】:

  • 谢谢@FloWy!你对使用命名空间来规避这个编译时问题有什么想法? ``` 命名空间测试{ 类字符串{ } } ``
  • 哦,是的。一种有效的方法是使用命名空间。但就个人而言,我不会真的推荐它。命名空间只是用于组织您的代码。此外,如果你也使用模块,同时使用命名空间是不好的做法。
  • class String{} 提示Duplicate Identifier 错误。但是,添加 export class String{} 的导出关键字可消除此错误。这是预期的吗?
  • String 类的声明没有任何错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-03
  • 2023-02-07
  • 2022-08-22
  • 2022-06-10
  • 1970-01-01
  • 1970-01-01
  • 2014-09-28
相关资源
最近更新 更多