Tìm kiếm trang web

Kiểu alias trong Typescript cho phép Intellisense hiển thị tên alias, không phải kiểu gốc


Hãy xem xét đoạn mã ngắn này

type A = number;

declare function f(): A;

const a = f(); // `a` is number, not A

Tại sao TS hiển thị a: number thay vì a: A?

Câu trả lời #1

Bí danh kiểu theo như tên của chúng gợi ý chỉ là những tên khác nhau cho các kiểu khác. Tên bí danh kiểu không phải là thứ mà trình biên dịch đảm bảo sẽ giữ lại (khác với giao diện) và nó áp dụng một phương pháp định đoán mang lại trải nghiệm người dùng tốt nhất (trong trường hợp này có thể nói là thất bại).

Cũng lưu ý rằng A và number về cơ bản là cùng một kiểu. Nếu bạn muốn đảm bảo rằng number không thể gán cho A, bạn cần sử dụng các kiểu được gắn nhãn (branded types).

type A = number & { isA: undefined};

declare function f(): A;

const a = f(); // `a` is A, not number

chơi

Lưu ý: Cũng có những đề xuất (cái này và cái này) để tích hợp cơ chế kiểu thương hiệu vào TypeScript, nhưng vào thời điểm viết bài này, nó vẫn chưa được hoàn tất.

Câu trả lời #2

Đây là cách bạn có thể giữ tên bí danh, trong khi sử dụng nó như một con số

interface PreserveAliasName extends Number {}
type A = number & PreserveAliasName;

declare function f(): A;
const a = f(); // `a` is A
const b: A = 5; // allows primitive assign, unlike branded types
const c = BigInt(b); // still allows usage like primitive

So với loại có thương hiệu:

type A = number & { __brand: 'A' };
declare function f(): A;
const a = f(); // `a` is A
const b: A = 5;
  Type 'number' is not assignable to type '{ __brand: "A"; }'
const b: A = 5 as A; // needs casting
const c = BigInt(b); // still allows usage like primitive

So với giao diện

interface A extends Number {}
declare function f(): A;
const a = f(); // `a` is A
const b: A = 5; // allows primitive assign
const c = BigInt(b)
  Argument of type 'A' is not assignable to parameter of type 'string | number | bigint | boolean'.
const c = BigInt(b as number) // needs casting

Bài viết liên quan