【问题标题】:Define unknown type Javascript function in Typescript definition file在 Typescript 定义文件中定义未知类型的 Javascript 函数
【发布时间】:2017-08-19 04:03:01
【问题描述】:

我正在尝试将 when.js(github 上的一个公共 Promise 库,可以在 here 找到)作为 Cesium(描述为 here 的公共 3-D 建模框架)的属性包含在 Typescript 定义文件中我有铯库。这是因为我正在尝试将使用 Cesium 的项目中的一些 Javascript 文件转换为 Typescript,并且引用的 Cesium.js 代码包含以下代码 sn-p。但是,我不知道如何在 d.ts 文件中声明 when.js。它似乎不是一个类,我不认为它是一个接口。我应该如何处理这个属性 - 它是什么类型的对象?

(function(define) { 'use strict';
define('ThirdParty/when',[],function () {
var reduceArray, slice, undef;

//
// Public API
//

when.defer     = defer;     // Create a deferred
/* more when.otherProperties set here */

/**
 * Register an observer for a promise or immediate value.
 *
 * @param {*} promiseOrValue
 * @param {function?} [onFulfilled]
 * @param {function?} [onRejected]
 * @param {function?} [onProgress]
 * @returns {Promise}
 */
function when(promiseOrValue, onFulfilled, onRejected, onProgress) {
    // Get a trusted promise for the input promiseOrValue, and then
    // register promise handlers
    return resolve(promiseOrValue).then(onFulfilled, onRejected, onProgress);
}

/**
 * @param {*} promiseOrValue the rejected value of the returned {@link Promise}
 * @returns {Promise} rejected {@link Promise}
 */
function reject(promiseOrValue) {
    return when(promiseOrValue, rejected);
}
/* more functions defined here, including a 'defer' function */

引用此的示例代码:

static getData(/* vars */) {
    /* stuff */
    return Cesium.when.reject('message here');
}

目前,如果我在我拥有的 Cesium.d.ts 文件中声明一个名为“when”的类,我可以让上述代码工作。唯一的问题是,在这种情况下“when”是一个构造函数,但正如代码 sn-p 中明确定义的那样,函数“when”返回一个 Promise。

我尝试过的方法有效(从某种意义上说,它可以编译和运行。可能会让一些 Typescript 爱好者心碎):

declare module Cesium {
    /* a lot of other functions, classes, interfaces, enums... */
    class when extends Promise<any> {
        constructor(promiseOrValue: any, onFulfilled?: Function, onRejected?: Function, onProgress?: Function);
        static reject(promiseOrValue: any): Promise<any>;
    }
}

非常感谢任何建议。

编辑

在浏览了 Typescript 文档之后,我确信我需要的是 hybrid type。但由于它被声明为接口,TS 编译器不会将其识别为 Cesium 的属性。

这是我尝试过的:

interface when {
  (promiseOrValue: any, onFulfilled?: Function, onRejected?: Function, onProgress?: Function): any
  reject(promiseOrvalue: any): any;

}

这会导致编译时出现以下错误:

TS2339: Property 'when' does not exist on type 'typeof Cesium'.

【问题讨论】:

  • 究竟导出了什么?
  • 铯库。它包含这个第三方“when.js”。最初我下载了一个在线可用的 Cesium.d.ts 文件(gist.github.com/mgiraldo/f07432df1ccc50a0ea6e),但在这个定义文件中没有定义。

标签: javascript typescript


【解决方案1】:

我看到他们的 warn.js 包含带有类型的 JSDoc cmets。

你应该试试这个工具:

https://github.com/ConquestArrow/dtsmake

自动生成 .d.ts 文件。支持JSDoc注解。

【讨论】:

  • 感谢您的建议。我知道存在这样的工具;但是,在依赖工具之前,我想知道如何自己编写它们。此外,上述工具的最新构建失败..
猜你喜欢
  • 1970-01-01
  • 2020-08-24
  • 2020-08-29
  • 1970-01-01
  • 1970-01-01
  • 2018-04-09
  • 1970-01-01
  • 1970-01-01
  • 2020-06-04
相关资源
最近更新 更多