如何将外部类型定义用作接口而不是类型

发布于 2025-01-11 19:02:15 字数 849 浏览 0 评论 0 原文

在我的 Next.js Web 应用程序中,我使用以下命令将 Swagger/OpenAPI 类型导入到 global.d.ts 中:

type ApiDefinitions = import('types/swagger').definitions

...然后我可以使用以下命令简化该类型在我的应用程序中的使用

type User = ApiDefinitions['User']

:如果我想使用界面用户而不是类型用户

这不起作用,因为它似乎将 User 定义为 any:(

interface User extends ApiDefinitions['User'] {}

产生错误:类型错误:属性“name”在类型“User”上不存在

更新

请参阅此 CodeSandbox 示例,它给出了相同的错误:

CodeSandbox 截图

In my Next.js web app, I’m importing my Swagger/OpenAPI types into global.d.ts with:

type ApiDefinitions = import('types/swagger').definitions

…and then I can simplify the use of that type in my app with:

type User = ApiDefinitions['User']

But what if I want to use interface User instead of type User?

This doesn’t work because it seems to define User as any:

interface User extends ApiDefinitions['User'] {}

(Produces error: Type error: Property 'name' does not exist on type 'User')

Update

See this CodeSandbox with example, it gives same error:

CodeSandbox screenshot

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

千柳 2025-01-18 19:02:15

您可以尝试继续使用类型:

type User = ApiDefinitions.User & {
   customField: unknown;
}

you can try to keep using types:

type User = ApiDefinitions.User & {
   customField: unknown;
}
清晨说晚安 2025-01-18 19:02:15

如果您希望用户界面作为实际界面,那就从命名空间 ApiDefinitions“导入”用户界面,不是吗?

与我们如何使用 import("module") 将模块的类型作为命名空间导入类似,我们也可以使用 import 从命名空间导入类型:

import User = ApiDefinitions.User;

Wack 语法但这是合理的。这有点像大多数语言中的 use/using

您可能还想要:

import ApiDefinitions = import("types/swagger").definitions;

相反。

<一href="https://www.typescriptlang.org/play?#code/HYQwtgpgzgDiDGEAEBBGBLAIhAZu46ALugPbBRIDeAsAFBINIQAeMJAToUvoROzgmQBVKHyp1Gk7gBMAXEmABXMACM+ AbgmMAvnV2066MG05IRYgLyoM2PAWJkoAOnPtNB2jz4DESAKLMvMDSENKUTIEQwRThNPSMoJDyUITs+ADm7vp08I5ciqLs8gFBIWGFSFZxkuhySAAMADRaDIkQ8gBEKiQqHc202upAA" rel="nofollow noreferrer">游乐场

If you want the User interface as an actual interface, that's "importing" the User interface from the namespace ApiDefinitions, no?

Similar to how we can use import("module") to import the module's types as a namespace, we can use import to also import a type from a namespace:

import User = ApiDefinitions.User;

Wack syntax but it is reasonable. This is kind of like use/using in most languages.

You might also want:

import ApiDefinitions = import("types/swagger").definitions;

instead.

Playground

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文