【问题标题】:Does TypeScript allow type aliases?TypeScript 是否允许类型别名?
【发布时间】:2014-02-17 21:33:16
【问题描述】:

所以我希望我可以为看起来像这样的丑陋类型使用别名:

Maybe<Promise<Paged<Carrier>, Problem>>[]

类似:

import Response = Maybe<Promise<Paged<Carrier>, Problem>>[];

有没有办法在 TypeScript 中做类型别名?

【问题讨论】:

标签: typescript alias


【解决方案1】:

Typescript 从 1.4 版开始支持类型别名 (source)。

类型别名

您现在可以使用 type 关键字为类型定义别名:

type PrimitiveArray = Array<string|number|boolean>;
type MyNumber = number;
type NgScope = ng.IScope;
type Callback = () => void;

类型别名与其原始类型完全相同;它们只是替代名称。

Typescript 从 1.6 版开始支持泛型类型别名 (source)。

泛型类型别名

在 TypeScript 1.6 之前,类型别名被限制为缩短长类型名称的简单别名。不幸的是,由于无法使这些通用化,它们的用途有限。我们现在允许类型别名是通用的,赋予它们完整的表达能力。

type switcharoo<T, U> = (u: U, t:T)=>T;
var f: switcharoo<number, string>;
f("bob", 4);

【讨论】:

  • 1.4 中的类型别名不支持类型参数,这使得它们大多无用,至少在我的设置中大多数东西都是通用的。讨论中还有一个关于向别名添加类型参数的请求:github.com/Microsoft/TypeScript/issues/1616 希望这个功能会引起足够的兴趣,所以它会被推动。
  • 根据@AlekseyBykov 的评论——泛型类型别名现已上线!见github.com/Microsoft/TypeScript/pull/3397
  • 我发现这些类型别名毫无用处,因为您不能使用它们来构造实例。这失败了:type MyMap = Map&lt;string, string&gt;; let map = new MyMap();
  • @jlh 好吧,类型别名(和一般类型)在编译后会被删除。因此,要使其按您的意愿工作,TS 需要重写您的 new 调用或为类型别名生成一些代码。这通常违反 TS 哲学和design goals。您始终可以创建自己的 MyMap 类或函数来包装底层 Map&lt;string, string&gt;;
  • @MariuszPawelski 是的,我最终包装了它,但如果底层类型有很多你想使用的方法,那就很痛苦了。如果可以仅扩展这些类型,那将是微不足道的,但这也不起作用,至少它不适用于Map,这是一个未解决的问题。
【解决方案2】:

TypeScript 支持导入,例如:

module A {
    export class c {
        d: any;
     }
}

module B {
    import moduleA = A;

    var e: moduleA.c = new moduleA.c();
}

module B2 {
    import Ac = A.c;

    var e: Ac = new Ac();
}

更新 1

从 TS 1.4 开始,我们可以使用类型声明:

type MyHandler = (myArgument: string) => void;

var handler: MyHandler;

从 TS 1.6 开始,我们可以使用本地类型声明:

function f() {
    if (true) {
        interface T { x: number }
        let v: T;
        v.x = 5;
    }
    else {
        interface T { x: string }
        let v: T;
        v.x = "hello";
    }
}

【讨论】:

    【解决方案3】:

    穷人的解决方案是声明一个具有所需类型的虚拟变量(例如t)并使用typeof t而不是长类型表达式:

    var t: { (x: number, f: { (foo: string, bar:boolean): void }): void }; var f: t 类型; var g: t 类型;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-03
      • 2019-08-06
      相关资源
      最近更新 更多