使用声明合并来构建一个类型(Typescript)

时间:2017-11-23 19:45:47

标签: typescript typescript-typings

我使用declaration merging如下

var dialog = require('ti.safaridialog');

if (dialog.isSupported()) {
    dialog.open({
        url: 'http://appcelerator.com',
        title: 'Titanium rocks!',
        tintColor: 'red'
    });
}

但问题是,我该如何使用它。例如,如果我按如下方式使用它

function barfoo(): void { /* magic */ }
namespace barfoo {
    export let maz: Array<string> = [];
}

打字稿正在抱怨:function doIt(cb: barfoo): void { cb.maz = [10]; cb(); }

DEMO

如何修改类型的任何建议(不使用Cannot find name 'barfoo'. :)?

更新:我想出了如何创建这种类型的新功能

any

DEMO

但是,正如您所看到的,第二个例子非常复杂。这是正确的方法还是可以简化?

1 个答案:

答案 0 :(得分:1)

您的问题是barfoo,但在您对doIt()的定义中,您错误地将其视为类型。所有值都有类型,但值的名称很少是其类型的名称。如果我执行let x = 3;,则x是一个值,但其类型为number,而不是x

从您的代码中可以看出,您希望能够将值barfoo传递给函数。 (为什么你想要做这样的事情是你的事,但如果你只是将这一个值传递给函数,你可能想要考虑根本没有它是一个参数。由你决定但是。)因此,cb参数应声明为barfoo的类型,无论它是什么。通过检查,您可以看到它类似于{ (): void; maz: string[] }。  但幸运的是,TypeScript允许您使用type query快速获取命名值的类型,Object.assign()重用关键字typeofbarfoo的类型只是typeof barfoo

function doIt(cb: typeof barfoo): void {
    cb.maz = [10];  // error, hey 10 is not a string
    cb();
}

这样可行,甚至可以为您捕获另一个错误。希望有所帮助;祝你好运!

更新

如果你想创建更多与barfoo相同类型的对象,那就是:一个可调用的函数(没有参数并且返回void),它也包含maz属性一个字符串数组,最直接的方法是使用intersection,它将所有属性合并到第一个参数中,并将其作为所有参数类型的Firebase Cloud Functions返回。像这样:

const barfoo2 = Object.assign(
  function() {
    // function body here
  },
  {maz: ["some","stuff"]}
);

doIt(barfoo2); // works

再次祝你好运!