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
