在Typescript定义文件中定义未知类型的Javascript函数

在Typescript定义文件中定义未知类型的Javascript函数

问题描述:

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

(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”返回一个Promise。

我试过了工作(因为它编译和运行的感觉可能打破一些打字稿爱好者的心):

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>; 
    } 
} 

任何意见是极大的赞赏。

编辑

在绕过多一点戳上打字稿文档之后,我越来越确信,我需要的是一个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'. 
+0

什么是准确导出? – lilezek

+0

铯库。它包含此第三方“when.js”。最初我在网上下载了一个Cesium.d.ts文件(https://gist.github.com/mgiraldo/f07432df1ccc50a0ea6e),但它没有在这个定义文件中定义。 – anon

我看到他们warn.js包含类型JSDoc评论。

你应该试试这个工具:

https://github.com/ConquestArrow/dtsmake

为了.d.ts自动文件。它支持JSDoc注释。

+0

感谢您的建议。我知道有这样的工具存在;不过,我想知道如何根据工具自行编写它们。此外,最近为上述工具构建失败.. – anon