打字稿 - 条件要求

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`.

【讨论】:

以上是关于打字稿 - 条件要求的主要内容,如果未能解决你的问题,请参考以下文章

在条件中使用打字稿变量

对象打字稿中的条件类型

打字稿条件类型内部类型

React 条件渲染组件打字稿

打字稿:“关注”条件类型

禁用带有条件的按钮打字稿