【问题标题】:Svelte / Typescript - sharing a namespace across multiple filesSvelte / Typescript - 跨多个文件共享命名空间
【发布时间】:2022-01-02 21:51:13
【问题描述】:

我不确定这是否可能,但在我排除之前,我只是想要一些反馈。

我正在命名空间下组织我的 Svelte/Typescript 项目中的变量类型。理想情况下,我希望在单个命名空间(类型)下组织的多个文件中的所有类型

例如: - /types/type.user.ts

export namespace Types {
  export type User {
   name : '',
   email: ''
  }
}

然后在 -components/type.column.ts

export namespace Types {
  export type Column {
   id : '',
   filter : ''
  }
}

将这些类型导入单个文件时会出现问题,因为它会导致解析导出命名空间的歧义:

import { Type } from "/src/types/type.user";
import { Type } from "/src/components/types/type.column";

我找不到解决此问题的方法。在我放弃命名空间或将类型合并到单个文件之前,这可能吗?

【问题讨论】:

  • @Jhecht 谢谢,在发布问题之前已经参考了该指南。不幸的是,我无法让它在 svelte 中工作。
  • 您是否在使用/// <reference path="./components/type.column.ts /><reference path="./types/type.user.ts" /> 以及参考?我建立了一个快速的 deno 项目,似乎没有任何问题,但我可以用一些苗条来验证
  • 是的,我尝试使用参考,但它们似乎在 Svelte 中没有效果。你让它在 Svelte 中工作了吗?
  • 现在检查,给我 5 分钟的时间来制作一个新的苗条项目

标签: typescript svelte


【解决方案1】:

为了让它工作,我创建了 3 个文件:src/components/type.column.tssrc/types/type.user.tscomponent.svelte

我还必须通过设置 "isoluatedModules": false 来修改 tsconfig.json 文件(因为这显然是使用 Vite 创建的苗条项目的默认设置)。

src/components/type.column.ts

namespace Types {
  export type Column = {
    id: string;
    filter: string;
  }
}

src/types/type.user.ts

/// <reference path="../components/type.column.ts" />
namespace Types {
  export type User = { 
    name: string;
    email: string;
  }
}

component.svelte

<script lang="ts">
/// <reference path="../types/type.user.ts">
const someUser: Types.User = {
  email: '',
  name: ''
};

const someColumn: Types.Column = {
  filter: '',
  id: 'some-id'
};

</script>

不过,我会指出,我不确定我是否会亲自使用这种方法。我倾向于尝试将内容保存在最相关的位置,因此我可能会删除 Types 命名空间,并简单地从每个文件中导出单个类型。我认为执行以下操作没有问题:

<script lang="ts">
import type { User } from '../types/type.user';
import type { Column } from '../components/type.column';
const someuser: User = {...};
const someColumn: Column = {...};
</script>

这在很大程度上归结为个人喜好,但是通过更改 isolatedModules 设置,我们可能会在稍后使用 svelte 预处理器时遇到错误——我会向前说我实际上并不知道很多关于苗条团队使用此设置的原因,所以我不能多说,但我认为他们一定是有原因的。请记住,虽然这行得通,但它最终可能会成为未来一些挫折的原因。

【讨论】:

  • 我的解决方案与您的解决方案几乎相同。虽然,我无法按照您的建议导出单数类型,因为它会导致 IDE 出现错误。通过从命名空间中删除导出命名空间,我让它工作。奇怪的是,我什至不需要在我的主 svelte 文件中导入类型文件。另一个问题是 Webstorm 和 VS 代码都抱怨应该导出命名空间。不知道我是否应该抑制错误。正如您警告我的那样,它可能会在将来引起问题。我需要考虑走哪条路。感谢您为此提供的所有帮助。
  • 在 IDE 中导出单数类型会导致哪些错误?我使用 VSCode,我的没有抱怨;想知道这是否是 webstorm 特有的?
  • 如果我不导出命名空间(命名空间类型)而不是(导出命名空间类型),VsCode 和 Webstorm 都会产生错误“TS1208: 'type.column.ts' cannot be compiled under '- -isolatedModules' 因为它被认为是一个全局脚本文件"
  • 啊,我明白了。当我读到你的回复时,我比我想象的还要累。道歉。
猜你喜欢
  • 1970-01-01
  • 2018-02-28
  • 2018-11-30
  • 1970-01-01
  • 2021-11-21
  • 2012-05-19
  • 2013-05-20
  • 2012-04-28
  • 1970-01-01
相关资源
最近更新 更多