【问题标题】:Type reference without full namespace没有完整命名空间的类型引用
【发布时间】:2013-03-22 13:09:14
【问题描述】:

有两个打字稿文件:

A.ts:

export class Person {
    public name:string;
    constructor(){}
}

B.ts:

import A = module("A");
var p: A.Person;

到目前为止一切正常。

但是,当我尝试为从 A.ts 导入的类型名称创建快捷方式时:

var Person = A.Person;
var pp: Person;

编译器抱怨(就行:“v​​ar pp: Person”):

当前范围内不存在名称“Person”

我怎样才能实现这种或类似的语法,以避免长命名空间?

【问题讨论】:

  • 我不知道如何实现您想要做的事情,但是您使用速记表示遇到的问题是 Person 不是 TypeScript 类型而是对类的引用。因此,您可以使用 var pp = new Person(); 而不是写 var pp : Person;
  • 所以,我可以创建类的实例,但不能声明类的变量。编译器将能够在一种情况下推断变量的类型,而在另一种情况下无法推断。在我看来,编译器中有一个错误。无论如何,第二个示例 ('var pp = new Person();') 确实有效。谢谢。

标签: typescript


【解决方案1】:

在 TypeScript 中,类型注释必须与编译器已知的类型相关。您不能只使用变量作为类型。您为模块指定的别名是您在 import 语句中指定的别名 - 因此您可以在此处从长命名空间别名为短别名:

import alias = module("My/Long/Module/Path");

但是你然后必须使用别名。

要得到你想要的结果,你必须使用扩展模块类方法的有点疯狂的本地类:

import myModule = module("MyModule");

class Person extends myModule.Person {
}

var x: Person;

【讨论】:

  • 扩展课程对我来说有点太多了。我会坚持使用别名。谢谢。
【解决方案2】:

我认为您应该得到的错误是“类型未定义”但是目前的错误是“名称不存在于当前范围内”。这是因为变量和类型的单独声明空间。不能在类型名称部分中引用变量。

你可以在这里看到一个简单的单个文件案例:

module M
{
    export interface P {}
}

import im = M; 
var foo1:im.P; // Okay 

var vm = M;
var foo2:vm.P; // Error 

然而,减少字母数量的解决方案是史蒂夫提到的继承。

【讨论】:

    猜你喜欢
    • 2011-03-24
    • 1970-01-01
    • 2017-06-04
    • 1970-01-01
    • 2021-05-10
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 2014-08-18
    相关资源
    最近更新 更多