【问题标题】:"as" notation with TypeScript, need to export a namespace?使用 TypeScript 的“as”表示法,需要导出命名空间吗?
【发布时间】:2017-03-20 07:44:50
【问题描述】:

我有这个 TypeScript 代码:

import * as suman from 'suman';

const Test = suman.init(module,{
    ioc: {
        a: 'foo',
        b: 'far'
    } as suman.Ioc
});

如您所见,我试图声明 ioc 对象的类型为 suman.Ioc(ioc 对象应“遵守 Ioc 接口”)。但是我的 IDE 说“找不到命名空间 'suman'”。

在这种情况下,我如何创建一个类型并在我的代码中引用它?如果可能的话,我希望能够从 suman 导入中引用 Ioc 对象类型。

换句话说,我不想在同一个文件中做这一切:

    declare namespace suman {

        interface Ioc {
             a: string,
             b: string
        }
    }


   import * as suman from 'suman';

    const Test = suman.init(module,{
       ioc: {
          a: 'foo',
          b: 'far'
        } as suman.Ioc  
    });

原因是因为我必须为每个这样的文件重复命名空间声明,这不应该是必要的(或建议的)。

【问题讨论】:

  • 是否输入了suman?如果没有,它没有Ioc 接口,因此错误。
  • 另外,不完全确定您想通过“尝试声明 ioc 对象的类型为 suman.Ioc”来实现什么。你能详细说明一下吗?
  • suman 是一个常规的 node.js 模块。我有一些类型定义,但显然它们不正确或位置错误。我正在尝试实现:如果对象具有 Ioc 接口中未定义的属性,则记录错误/警告。
  • tbh,这是我曾经在 SO 上问过的最令人困惑的问题之一。我很困惑,我正在努力让被问者尽可能容易地不要像我一样困惑,但不确定它是否有效。
  • "日志错误/警告..." 这只能在 IDE/编译时发生。这是你需要的吗?

标签: node.js typescript typescript2.0


【解决方案1】:

suman 已输入,但输入的版本尚未发布。

目前,如果您愿意使用最新的代码,您可以通过npm install sumanjs/suman 安装它。

如果您想使用最新版本并使用类型,您可以考虑使用typings 安装类型文件:typings install suman=github:sumanjs/suman/lib/index.d.ts 并在您的tsconfig.json 中包含typings/index.d.ts。

至于as suman.Ioc,这是一种告诉编译器“嘿,我知道你认为这个‘东西’属于其他类型,但我希望你把它当作‘suman.Ioc’ ”。

这就是为什么,即使打字在那里,它也不会做你想要的。

幸运的是,suman 提供的类型很适合您。

【讨论】:

  • 嗯,所以我把它放在 括号中,而不是使用“as”符号?
  • 我对 括号中的项目如何引用 ioc 对象感到困惑......如果我有两个属性,ioc 和 foo 怎么办?会是 。我喜欢“as”符号,我希望它能在这里工作。
  • <angled> 是泛型。不是类型转换。
  • init函数的签名是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-15
  • 1970-01-01
  • 2018-02-21
  • 2023-03-19
  • 2018-01-05
相关资源
最近更新 更多