【问题标题】:Creating TypeScript type definitions for a library that exports factory function为导出工厂函数的库创建 TypeScript 类型定义
【发布时间】:2017-04-15 07:35:52
【问题描述】:

我正在尝试为库创建类型定义文件。该库很久以前就已交付给客户,因此我无法更改其代码。

我正在使用 TypeScript 2.*

库包导出单个工厂函数(使用默认导出);用户可以使用该工厂函数创建库的实例。 我用于 lib.d.ts 的是

declare var _createLib: (config: Object) => Promise<Lib>;
export default _createLib;

export interface Lib {
    version: string;
}

然后我尝试在 TypeScript 中使用它,例如:

import LibFactory from 'lib';

LibFactory(configObject).then((actualLib: Lib => {
    // do some magic here
});

但是它失败了,因为没有定义Lib类型(actualLib的那个)。

有两种方法可以让它工作,但我不确定这些是正确的解决方案:

1) 从 Lib 中全部导入

import * as Lib from 'lib';

Lib.default(configObject).then((actualLib: Lib.Lib => {
});

2) 将默认值导入为某个名称,并将库中的任何其他类型命名为 import

import {default as Factory, Lib as Lib} from 'lib';

Factory(configObject).then((actualLib: Lib=> {
});

我错过了什么?在这种情况下,有没有更好的方法来创建和使用类型定义?

【问题讨论】:

    标签: typescript typescript-typings


    【解决方案1】:

    你是对的,在这种情况下你应该导入两个部分。但是这个语法应该也适合你:

    import Factory, { Lib } from 'lib';
    
    Factory(configObject).then((actualLib: Lib=> {
    });
    

    另外,如果工厂有正确的定义,你可以省略指定actualLib的类型:

    import Factory from 'lib';
    
    Factory(configObject).then((actualLib => {
    });
    

    Typescript 会知道它的类型。

    【讨论】:

    • 但是,当将此结果转换为像 Factory.default(configObject) 这样抛出默认值的 JS 不是函数时
    • 您的factory.js,而不是factory.d.ts,必须有默认导出。我提供的只是对您的import {default as Factory, Lib as Lib} from 'lib'; 进行更短的重写如果这条线有效,我的答案也将有效。
    猜你喜欢
    • 1970-01-01
    • 2021-04-19
    • 2021-02-07
    • 1970-01-01
    • 2020-10-10
    • 1970-01-01
    • 2019-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多