【问题标题】:Typescript types for code that is not imported by typescript?打字稿不导入的代码的打字稿类型?
【发布时间】:2019-04-11 10:53:06
【问题描述】:

这是 Angular 应用程序的问题,但我不认为这是特定于 Angular 的问题。

我正在开发一个 Angular 7 应用程序,并且我正在使用一些库,这些库是通过前端的脚本标签从其他来源(Stripe、recaptcha、googletags 等)导入的。我将在这里使用 Stripe 作为示例,因为 Stripe 绝对要求客户端从 Stripe.js 导入前端库以符合 PCI 标准,因此从源服务器端不是一个选项。

我已经安装了来自definitelyTyped 的Stripe 的类型。如果我在组件中添加declare let Stripe: any; 并使用Stripe,它可以工作,但当然它不是类型安全的。如果我省略声明,VSCode 会发现类型正常,并且编辑器会捕获类型错误,但它不会编译,(error TS2304: Cannot find name 'Stripe'.)可能是因为我没有用于 Stripe 的import 语句。

有什么方法可以提示 TypeScript 应该使用来自definitelyTyped 的类型来捕获类型错误,而不需要导入 Stripe 库本身?

编辑:我收回我所说的不认为这是 Angular 特定的。我现在认为这可能与角度编译过程有关。

【问题讨论】:

  • 您是否使用 NPM 安装了这些类型?你的 tsconfig 是什么样的?
  • 感谢您的关注。我相信我在另一个 stackoverflow 问题中找到了我的问题的答案(请参阅下面的答案)。

标签: angular typescript angular7


【解决方案1】:

我的问题的答案似乎在这里:@types/googlemaps/index.d.ts' is not a module 也就是说,我可以使用三斜杠指令,或者在根 typings.d.ts 文件中声明模块。

【讨论】:

    【解决方案2】:

    我过去也遇到过同样的问题,而且我还发现在不导入实际模块的情况下使用import 导入类型定义文件是不可能的。

    所以,我所做的是,我将类型定义文件(通常是 index.d.ts复制到我的代码库中。

    之后,您可以执行以下操作:

    import {SomeType} from "sometype.d.ts"
    declare let ObjectImportedFromHTMLScriptTag: SomeType;
    

    然后,您可以在不破坏类型安全的情况下使用导入的对象。

    【讨论】:

    • 复制过去不是一个好主意,但是如果您从 node_modules 直接访问此 d.ts 会如何工作?
    • @Gilsdav 在不导入实际模块的情况下也可以正常工作,但是请记住使用--save-dev 选项安装类型。
    猜你喜欢
    • 1970-01-01
    • 2012-12-26
    • 2020-04-19
    • 2023-02-09
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 2018-05-24
    • 2019-11-17
    相关资源
    最近更新 更多