【问题标题】:Typescript - Conditional require打字稿 - 条件要求
【发布时间】:2017-05-08 22:13:22
【问题描述】:

moment-timezone 的一个问题是,如果你多次包含它,它会给你一个警告。我有一个需要时区的模块。因为我不知道使用的人是否会自己设置时区,所以我有以下内容:

if (moment.tz === undefined) {
    require('moment-timezone');
    moment.tz.setDefault('America/Los_Angeles');
}

这在普通的 Javascript 中运行良好。我最近正在尝试切换到 Typscript,当我这样做时,我得到了 Cannot find name 'require' 的错误。

我将该行切换到import momentTimezone = require('moment-timezone');,然后得到An import declaration can only be used in a namespace or module.

我能做什么?

【问题讨论】:

  • 我认为这可以帮助你:stackoverflow.com/questions/12742082/…
  • @Matthijs,不,我最初看到的是(这就是 import momentTimezone =... 尝试的来源)。但这也行不通:(
  • 这段代码的执行上下文是什么?如果这是在浏览器中,您需要有一个可用的模块加载器以确保定义了 require。如果这是在 node 中,您需要为 require 函数安装类型(通过 require 或 node)或声明该函数类型,就像在 @Matthijs 引用的帖子中一样
  • 导入失败的原因是导入语法是一些特定于 TS 的额外内容。这让 TS 可以根据 tsconfig 中的模块配置编译成各种依赖规范格式。就像您使用 ES6 样式导入 (import {...} from '...') 一样。动态需求需要使用 require 函数作为特定于加载器的函数。

标签: javascript typescript


【解决方案1】:

import foo = require ('foo') 是特定于打字稿的。它做了两件事,将类型定义导入到声明空间,将实际模块导入到变量空间。如果您在任何时候都不使用导入的模块并且仅将其用于打字,那么它将在运行时被删除。但是如果你在变量命名空间上使用它,例如,调用一个方法或将它分配给一个变量,那么你将得到一个运行时导入。知道这一点非常重要,因为它会让您感到惊讶。

如果你想导入和使用类型定义,并且只在满足某些条件时才导入实际模块,那么你必须将 typescript 的导入与常规要求结合起来,如下所示:

import foo = require('foo');

export function loadFoo() {
// This is lazy loading `foo` and using the original module *only* as a type annotation
    var _foo: typeof foo = require('foo');
    // Now use `_foo` as a variable instead of `foo`.
}

【讨论】:

    猜你喜欢
    • 2012-11-03
    • 1970-01-01
    • 2019-05-03
    • 2020-08-14
    • 2021-04-26
    • 1970-01-01
    • 2016-01-28
    • 2015-10-24
    • 2014-01-25
    相关资源
    最近更新 更多