打字稿用动态导入在ES5与蓝鸟(TypeScript use dynamic import in E

2019-09-29 22:45发布

我试图用新的动态import()在打字稿功能,但我得到了以下错误:

TS2712:在ES5 / ES3动态导入调用需要“承诺”的构造。 请确保您有对“无极”的构造函数的声明或者在您的“ES2015” --lib选项。

我可能包括ES2015.promise在我tsconfig LIB如消息表明,但那会让我失去的类型安全,因为我使用蓝鸟承诺。

我知道这是可能使用蓝鸟为async/await的打字稿,所以我想这也应该相同的方式工作。


该消息也提到了这一点:

请确保你有一个声明为“无极”的构造函数或[...]

是否有可能宣布将用作TS无极构造青鸟构造?


示例代码:

import * as Bluebird from 'bluebird';

// This works
async function exampleAsync(): Bluebird<number> {
    const result = await Bluebird.resolve(5);
    return result;
}

// This does not
import('jquery').then($ => {
    console.log($.fn.jquery);
});

TSConfig:

{
  "compilerOptions": {
    "module": "commonjs",
    "target": "es5",
    "removeComments": true,
    "sourceMap": true,
    "alwaysStrict": true,
    "forceConsistentCasingInFileNames": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "strictNullChecks": true,
    "allowJs": true,
    "typeRoots": ["node_modules/@types"],
    "lib": ["es5", "dom", "es2015.collection"]
  },
  "exclude": ["node_modules"]
}

Answer 1:

打字稿正在寻找一个全球性的 Promise 。 你必须在你的代码什么是Promise模块(“青鸟”)中声明,并在另一模块本地使用。

这里有一个最小的方式来获得编译错误是决心和有可运行的代码:

test.ts

import * as Bluebird from 'bluebird';

declare global {
    const Promise: {
        new <R>(callback: (
            resolve: (thenableOrResult?: R | PromiseLike<R>) => void,
            reject: (error?: any) => void,
            onCancel?: (callback: () => void) => void
        ) => void): Bluebird<R>;
    };
}

import('jquery').then($ => {
    console.log($);
});

我已经修改了console.log语句只输出$ ,这样上面的代码可以很容易地在节点运行,而不是需要一个浏览器。 (当加载jquery的节点,你会得到一个需要构造Window实例,从中再建的同类jQuery对象,当你加载你立刻得到jquery一个窗口,所以$.fn.jquery无法访问。)

我使用以下tsconfig.json这是我从你得到的:

{
  "compilerOptions": {
    "module": "commonjs",
    "target": "es5",
    "removeComments": true,
    "sourceMap": true,
    "alwaysStrict": true,
    "forceConsistentCasingInFileNames": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "strictNullChecks": true,
    "allowJs": true,
    "skipLibCheck": true,
    "lib": ["es5", "dom", "es2015.collection"]
  }
}

你必须在有一对夫妇不必要的选项, skipLibCheck需要处理的问题@types/jquery



文章来源: TypeScript use dynamic import in ES5 with Bluebird