TypeScript có cho phép loại bí danh không?


90

Vì vậy, tôi ước mình có thể sử dụng một bí danh cho một kiểu xấu xí trông như thế này:

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

Cái gì đó như:

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

Có cách nào để gõ bí danh trong TypeScript không?


Như ryan trả lời. Một điều thiếu dù là nhà điều hành quá tải, vì vậy bạn không thể mở rộng một cái gì đó như số
— basarat

1
3 ngày trước typecript đã giới thiệu bí danh loại: blog.msdn.com/b/typescript/archive/2014/11/18/…
— ẩn


Câu hỏi đặc biệt, Cảm ơn bạn!
— Pedro Ferreira

Câu trả lời:


124

Từ phiên bản 1.4 Typescript hỗ trợ các bí danh kiểu ( nguồn ).

Nhập bí danh

Bây giờ bạn có thể xác định bí danh cho một loại bằng cách sử dụng từ khóa loại:

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

Bí danh loại giống hệt như loại ban đầu của chúng; chúng chỉ đơn giản là tên thay thế.

Và từ phiên bản 1.6 Typescript hỗ trợ bí danh kiểu chung ( nguồn ).

Bí danh loại chung

Dẫn đến TypeScript 1.6, các bí danh kiểu đã bị hạn chế thành những bí danh đơn giản giúp rút ngắn các tên kiểu dài. Thật không may, không thể làm cho những thứ này chung chung, chúng đã bị hạn chế sử dụng. Giờ đây, chúng tôi cho phép các bí danh loại là chung chung, mang lại cho chúng khả năng biểu đạt đầy đủ.

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

Nhập bí danh trong 1.4 không hỗ trợ các tham số kiểu khiến chúng hầu như vô dụng, ít nhất là trong cài đặt của tôi, nơi hầu hết mọi thứ đều chung chung. Có một yêu cầu khác trong cuộc thảo luận về việc thêm các tham số kiểu vào bí danh: github.com/Microsoft/TypeScript/issues/1616 Hy vọng rằng sẽ có đủ lãi suất được tạo ra cho bộ lông này, để nó được đưa vào cuộc sống.
— Trident D'Gao

3
Theo nhận xét từ @AlekseyBykov - bí danh loại chung hiện đã xuất hiện! Xem github.com/Microsoft/TypeScript/pull/3397
— brynb

Tôi thấy những bí danh kiểu này là vô dụng, vì bạn không thể sử dụng chúng để tạo các phiên bản. Điều này không thành công:type MyMap = Map<string, string>; let map = new MyMap();
— jlh

@jlh Chà, bí danh kiểu (và các kiểu nói chung) sẽ bị xóa sau khi biên dịch. Vì vậy, để làm cho nó hoạt động như bạn muốn TS sẽ cần phải viết lại bạn newgọi hoặc tạo một số mã cho bí danh loại. Và điều này nói chung là chống lại triết lý và mục tiêu thiết kế của TS . Bạn luôn có thể tạo bạn của MyMaplớp hoặc chức năng mà kết thúc tốt đẹp tiềm ẩnMap<string, string>;
— Mariusz Pawelski

@MariuszPawelski Có, tôi đã kết thúc việc này, nhưng thật khó nếu loại cơ bản có nhiều phương thức bạn muốn sử dụng. Sẽ là tầm thường nếu có thể chỉ mở rộng các loại này, nhưng điều đó cũng không hoạt động, ít nhất là không Map, có một vấn đề mở cho điều đó.
— jlh

11

TypeScript hỗ trợ nhập, ví dụ:

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();
}

Cập nhật 1

Vì TS 1.4, chúng ta có thể sử dụng khai báo kiểu:

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

var handler: MyHandler;

Kể từ TS 1.6, chúng ta có thể sử dụng khai báo kiểu cục bộ:

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";
    }
}

8

Giải pháp của một người nghèo là khai báo một biến giả (ví dụ t) với kiểu mong muốn và sử dụng typeof tthay cho biểu thức kiểu dài:

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

var f: typeof t;
var g: typeof t;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.