首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在主导入的同时导入类型和导入/要求

在主导入的同时导入类型和导入/要求
EN

Stack Overflow用户
提问于 2018-05-06 10:18:14
回答 1查看 2.6K关注 0票数 0

我正在为airtable编写一个定义文件,不幸的是,它们只导出了一个类,如下所示:

代码语言:javascript
运行
复制
...

module.exports = Airtable;

因此,我的airtable.d.ts文件如下所示:

代码语言:javascript
运行
复制
declare module "airtable" {
    export type MyType = { ... };

    export class Airtable {
        ...
    }

    export = Airtable;
}

当我导入Airtable类时,它工作得很好:

代码语言:javascript
运行
复制
import Airtable = require("airtable");
...
new Airtable(...)

但我也找不到一种导入MyType的方法:

代码语言:javascript
运行
复制
let a: Airtable.MyType;

导致此错误:

“‘Airtable”仅指类型,但此处用作命名空间

和:

代码语言:javascript
运行
复制
import { MyType } from "airtable";

造成这些错误的原因:

模块"airtable“没有导出成员'MyType‘ 模块"airtable“解析为非模块实体,不能使用此结构导入。

知道如何在继续使用export =import/require的同时导入其他导出类型吗?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-23 23:53:08

因此,答案实际上取决于你将如何使用类型。如果您在自己的项目中使用它们,则需要一个声明一个名为<whatever>.d.ts的模块的文件(称为"airtable" )。在这种情况下,你需要出口一些东西。由于要导出类,所以必须使用export = X语法而不是export X,因为要更改整个导出对象,而不是添加属性。在导出对象上(稍后将详细介绍)。至于类型,在您的.d.ts文件中的模块之外,您也可以decalre一种将成为全局可用的类型。如果这让你感到不舒服(或者你担心冲突),你也可以把你的类型放到一个模块中。因为它只是类型记录,所以它不需要任何js代码的支持。然后,您可以像正常情况一样导入/导出它:

代码语言:javascript
运行
复制
// my.d.ts

declare module 'airtable' {
  class Airtable {
    constructor(opts?: MyType)
  }
  export = Airtable
}

declare type MyType = string | number

declare module 'AirtableTypes' {
  export type MyString = string
  export type MyNumber = number
}

和使用

代码语言:javascript
运行
复制
// index.ts
import Airtable from 'airtable'
import AirtableTypes from 'AirtableTypes'

const a = new Airtable('a')

const n: MyType = 3

const s: AirtableTypes.MyString = '3'

如果您想向DefinitelyTyped中添加类型(我相信他们会很感激!)您可以按照指南这里编写声明文件。

它会指给你看

您(正确地)注意到Airtable导出了一个类,这个类对TS的性能不太好。有一些讨论这里。无论哪种方式,上面的指南都将指向module-class.d.ts,它允许您声明导出的类和伴随的类型。您不能使用上面的内容,因为只有当定义文件驻留在模块根目录或@types/<module>中时,格式才可用。

代码语言:javascript
运行
复制
/*~ This declaration specifies that the class constructor function
 *~ is the exported object from the file
 */
export = Airtable

/*~ Write your module's methods and properties in this class */
declare class Airtable {
  constructor(opts?: Airtable.AirtableMethodOptions)
}

/*~ If you want to expose types from your module as well, you can
 *~ place them in this block.
 */
declare namespace Airtable {
  export interface AirtableMethodOptions {
    endpointUrl: string
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50198579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档