TypeScript 版本的 Office Addins 文件不起作用

Office Addins file in its TypeScript version doesn't work

我正在使用 https://github.com/OfficeDev/Excel-Add-In-TS-Start

中的模板

基本上,它是 Visual Studio 生成的默认 Excel Office Addins 模板,但修改后也支持 TypeScript。

根目录中的文件 Home.ts 已经是其 TypeScript 版本。

还有一个名为 FunctionFile.js 的文件(在 Functions 文件夹中),我想在那里编写我自己的函数,但是是在 TypeScript 中。 因此,我创建了一个 ExecuteFunction 类型的功能区控件,指向一个名为 myTest.

的函数

FunctionFile.js 中,我写了下面的代码,当我点击插件命令时,它按预期工作:

(function () {
    Office.initialize = function (reason) {
    };
})();

function myTest() {
    Excel.run(function (ctx) {
        ctx.workbook.worksheets.getActiveWorksheet().getRange("A1").values = [["I was clicked!"]];

        return ctx.sync();
    }).catch(errorHandler);
}

function errorHandler(error) {
    console.log(error.message);
}

到目前为止,还不错。但是,正如我提到的,我希望一切都在 TypeScript 中工作,所以我尝试将它重命名为 FunctionFile.ts 并用它的 TypeScript 版本替换代码:

(() => {
    Office.initialize = () => {
    }
})();

function myTest(): void {
    Excel.run(async (ctx) => {
        ctx.workbook.worksheets.getActiveWorksheet().getRange("A1").values = [["I as clicked!"]];

        await ctx.sync();
    }).catch(errorHandler);
}

function errorHandler(error): void {
    console.log(error);
}

当我尝试 运行 时,函数 myTest 被调用,但是当它到达(我认为)Excel.run 方法时我得到了这个错误:

HTML1300: Ocorreu navegação.
FunctionFile.html
ReferenceError: 'Promise' is not defined (I translated this)
{
[functions]: ,
__proto__: { },
description: "'Promise' não está definido",
message: "'Promise' não está definido",
name: "ReferenceError",
number: -2146823279,
stack: "ReferenceError: 'Promise' não está definido
at Anonymous function (https://localhost:44356/Functions/FunctionFile.js:2:5)
at Anonymous function (https://localhost:44356/Functions/FunctionFile.js:42:32)
at Anonymous function (https://appsforoffice.microsoft.com/lib/1/hosted/excel-win32-16.01.js:21:205600)
at yi (https://appsforoffice.microsoft.com/lib/1/hosted/excel-win32-16.01.js:21:236067)
at st (https://appsforoffice.microsoft.com/lib/1/hosted/excel-win32-16.01.js:21:236154)
at d (https://appsforoffice.microsoft.com/lib/1/hosted/excel-win32-16.01.js:21:235974)
at c (https://appsforoffice.microsoft.com/lib/1/hosted/excel-win32-16.01.js:21:234560)"
}

其实错误发生在下面的JavaScript层(太乱了,无法分析):

return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
})

为什么当我将 Home.js 转换为 Home.ts 时它有效,但将 FunctionFile.js 转换为 FunctionFile.ts 却没有发生同样的情况?我是不是做错了什么?

当您使用 async/await 关键字时,TypeScript 希望您提供 Promise 实现。

来自书 "Building Office Add-ins using Office.js" (https://leanpub.com/buildingofficeaddins/) [免责声明,我是该书的作者]:

在您的情况下(以及我将在书中添加说明的内容),async 关键字有效地为您创建了一个 Promise,因此上述指导仍然适用。在 Script Lab 中,我们默认包含库 core-js(选项 #3),它提供了一个 Promise polyfill:

如果您不想引入额外的库,您也可以依赖 Office.js(只要您使用的是 ExcelApi 1.2+ 或 WordApi 1.2+)包含一个 Promise 库。因此,如果你愿意,你需要做的就是在 Office.initialized = function() { ... } 中添加以下一行,这将用 Office.js-provided-one 填充全局 window.Promise:

window.Promise = OfficeExtension.Promise;

希望对您有所帮助!