ChatGPT解决这个技术问题 Extra ChatGPT

如何在单独的文件中声明和导入 typescript 接口

我想在我的基于 typescript 的项目中在他们自己的文件中定义几个接口,我将从这些接口中实现用于生产的类以及用于测试的模拟。但是,我无法弄清楚正确的语法是什么。我找到了很多关于声明接口和实现它们的教程,但是它们都在同一个文件中对接口和派生类进行了简单的实现,这不是很真实。导出和导入接口的正确方法是什么?


L
Lee Goddard

您需要从定义的文件中导出接口,然后将其导入到您想要使用的任何位置。

IfcSampleInterface.ts 中:

export interface IfcSampleInterface {
   key: string;
   value: string;
}

SampleInterface.ts

import { IfcSampleInterface } from './IfcSampleInterface';
let sampleVar: IfcSampleInterface;

这是我最初尝试的语法,但我得到了错误。
@snort您能详细说明您遇到的错误类型吗?
看起来问题是类型名不能用作 Aurelia 中的键(或者我只是不知道如何正确声明它)。错误是“找不到名称 [BTAuthService]” 此代码给出错误:container.registerSingleton(BTAuthService, MockAuthService);如果我首先将接口分配给 var 并将其传递给 registerSingleton,则不会出错。
我想我对 TS/JS 构造函数和类型名称有误解。
接口类型从转译的代码中消除,因此错误。将此标记为我不完整问题的正确答案。真正的问题是我试图在这种特定情况下使用接口的名称作为类型名称。
A
Artem Koshelev

使用定义 (d.ts) 文件和命名空间,无需以这种方式导入/导出模块。绝对类型的项目有 guidance 和大量的 examples 怎么做。


这是国际海事组织的正确答案。如果你的文件只定义了一个接口,这是首选的方式,而且更简洁。
如果 module.tsmodule.d.ts 在同一文件夹中,编译器将跳过 module.d.ts 文件,因此不会考虑您的声明。重命名 d.ts 文件或将其移动到另一个文件夹。如果您有一个正确的模块,这种方法很好,但如果您想在模块之间共享类型,最好使用import .. from ..
这甚至是一个可以接受的答案。您可能认为它朝着正确的方向倾斜(并且可能确实如此),但是指向我们必须寻找的文章列表的通用链接才能找到 Artem 所暗示的答案,这相当于说“我是不解释共产主义,去网上搜索”
我将 d.ts 添加到我的反应项目中,但我仍然需要导入接口。
@gaurav5430 - 幸好它们在export类型时不是全局可用的。有一个老问题,类型共享的 d.ts 似乎是一个可行的选项(由团队成员建议):github.com/microsoft/TypeScript/issues/10908。在尝试创建仅包含共享使用的类型定义的模块时发现。为此使用 .ts 文件会导致该文件包含在输出中(显然是空的)。也就是说,同意,这不是声明文件的预期用途。
C
CPHPython

只导出几个接口

在不分散多个导出的情况下,您可以将它们分组到一个 export {} 块中(在这种情况下,不应声明文件 default 类型):

// interfaces.ts
interface IWords {
  [key: string]: string; 
}

interface INumbers {
  [key: string]: number; 
}

interface IBooleans {
  [key: string]: boolean; 
}

interface IValues {
  [key: string]: string | number; 
}

interface IStructures {
  [key: string]: INumbers | IBooleans | IValues;
}

export {
  // not exporting IWords | INumbers
  IBooleans,
  IValues,
  IStructures,
}

导入示例

import { IBooleans, IValues, IStructures } from 'interfaces';

const flags: IBooleans = { read: true, write: false, delete: false };

const userFile: IValues = { user: 1, username: 'One', file: 'types.txt' };

const userContext: IStructure = {
  file: userFile,
  permissions: flags,
  counts: { views: 3, writes: 1 } // => INumbers (lint: try to remove IValues from IStructures)
};

佚名

您需要在定义的文件中导出接口,然后在使用它们的文件中导入它们。有关示例,请参见此链接。

x.ts

interface X{
    ...
}
export default X

y.ts

import X from "./x.ts"
// You can use X now

有关详细信息,请参阅 https://www.typescriptlang.org/docs/handbook/modules.html


L
Levlin

您可以在相对较新的项目中使用以下语法

`import type { xxx } from './xxx'`

https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html


在一个使用 vite 的 Vue3 应用程序中,type { 帮助解决了一个令我非常恼火的问题。谢谢