我使用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();
}
如何修改类型的任何建议(不使用Cannot find name 'barfoo'.
:)?
更新:我想出了如何创建这种类型的新功能
any
但是,正如您所看到的,第二个例子非常复杂。这是正确的方法还是可以简化?
答案 0 :(得分:1)
您的问题是barfoo
是值,但在您对doIt()
的定义中,您错误地将其视为类型。所有值都有类型,但值的名称很少是其类型的名称。如果我执行let x = 3;
,则x
是一个值,但其类型为number
,而不是x
。
从您的代码中可以看出,您希望能够将值barfoo
传递给函数。 (为什么你想要做这样的事情是你的事,但如果你只是将这一个值传递给函数,你可能想要考虑根本没有它是一个参数。由你决定但是。)因此,cb
参数应声明为barfoo
的类型,无论它是什么。通过检查,您可以看到它类似于{ (): void; maz: string[] }
。
但幸运的是,TypeScript允许您使用type query快速获取命名值的类型,Object.assign()
重用关键字typeof
。 barfoo
的类型只是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
再次祝你好运!