【问题标题】:How to preserve type definitions of a function while exposing it on global namespace (object)?如何在全局命名空间(对象)上公开函数的类型定义?
【发布时间】:2017-01-30 07:16:45
【问题描述】:

基本上我不想在每个文件中都导入 lodash 函数。我想在一些全局名称空间(例如 L)上公开它们。我不想导入整个 lodash 库,而只想导入几个函数。我正在尝试关注一些事情,但后来我失去了类型支持。

interface Lod {
  head: Function
}

interface Window {
  L: Lod;
}

import head = require('lodash/head');

window.L = {
  head: head
}

所以现在当我使用 head() 时,IDE 为我提供了智能感知支持(显示错误,因为没有传递参数,但我应该给出一个数组),而且我从 typescript 得到编译错误,说我向 head 传递了不正确的参数(哪个是正确的)。

但是当我使用 window.L.head() 时,我没有从智能感知(没有错误)获得任何帮助,并且打字稿在编译时也没有给出任何错误(这是错误的,我应该得到错误)。

非常感谢您提前提供的帮助!

【问题讨论】:

  • 智能感知中缺少哪些信息?如果您没有收到任何编译器错误,那么应该没问题,并且您的智能感知应该能够处理好事情。
  • 嗨@NitzanTomer,感谢您对此进行调查。如果我使用 head('wrong', 'parameters') 那么我会在命令行上从 typescript 编译器获得智能帮助和错误(这是正确的)。但是当我使用 window.L.head('wrong', 'parameters') 时,我不会收到智能感知或命令行错误(这是错误的......我应该得到,因为我传递了错误的参数)

标签: typescript typescript-typings typescript2.0


【解决方案1】:

当您直接使用head 时,编译器可以检查其中的定义,这就是智能感知工作并且您遇到错误的原因。

但是您对Lod.head 的定义是Function,这就是编译器可以接受您传递任何参数的原因。

你应该这样做:

import head = require('lodash/head');

interface Lod {
    head: typeof head
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-05
    • 2013-08-11
    • 2014-08-12
    • 2019-09-21
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多