打字稿 - 条件要求
Posted
技术标签:
【中文标题】打字稿 - 条件要求【英文标题】: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.
我能做什么?
【问题讨论】:
我认为这可以帮助你:***.com/questions/12742082/… @Matthijs,不,我最初看到的是(这就是import momentTimezone =...
尝试的来源)。但这也行不通:(
这段代码的执行上下文是什么?如果这是在浏览器中,您需要有一个可用的模块加载器以确保定义了 require。如果这是在 node 中,您需要为 require 函数安装类型(通过 require 或 node)或声明该函数类型,就像在 @Matthijs 引用的帖子中一样
导入失败的原因是导入语法是一些特定于 TS 的额外内容。这让 TS 可以根据 tsconfig 中的模块配置编译成各种依赖规范格式。就像您使用 ES6 样式导入 (import ... from '...'
) 一样。动态需求需要使用 require 函数作为特定于加载器的函数。
【参考方案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`.
【讨论】:
以上是关于打字稿 - 条件要求的主要内容,如果未能解决你的问题,请参考以下文章