CẬP NHẬT Tháng 2 năm 2019
Trong TypeScript 3.4, sẽ được phát hành vào tháng 3 năm 2019 , có thể yêu cầu trình biên dịch suy ra loại một bộ ký tự là một bộ nhiều ký tự , thay vì như, giả sử string[]
, bằng cách sử dụng as const
cú pháp . Loại khẳng định này khiến trình biên dịch suy ra loại hẹp nhất có thể cho một giá trị, bao gồm cả việc tạo ra mọi thứ readonly
. Nó sẽ giống như thế này:
const list = ['a', 'b', 'c'] as const;
type NeededUnionType = typeof list[number];
Điều này sẽ loại bỏ nhu cầu về bất kỳ loại chức năng trợ giúp nào. Chúc may mắn một lần nữa cho tất cả!
CẬP NHẬT tháng 7 năm 2018
Có vẻ như, bắt đầu với TypeScript 3.0, TypeScript có thể tự động suy ra các loại tuple . Sau khi được phát hành, tuple()
hàm bạn cần có thể được viết ngắn gọn là:
export type Lit = string | number | boolean | undefined | null | void | {};
export const tuple = <T extends Lit[]>(...args: T) => args;
Và sau đó bạn có thể sử dụng nó như thế này:
const list = tuple('a','b','c');
type NeededUnionType = typeof list[number];
Hy vọng rằng hiệu quả cho mọi người!
CẬP NHẬT Tháng 12 năm 2017
Vì tôi đã đăng câu trả lời này, tôi đã tìm ra cách để suy ra các loại tuple nếu bạn muốn thêm một hàm vào thư viện của mình. Kiểm tra chức năng tuple()
trong tuple.ts . Sử dụng nó, bạn có thể viết những điều sau và không lặp lại chính mình:
const list = tuple('a','b','c');
type NeededUnionType = typeof list[number];
Chúc may mắn!
XUẤT XỨ tháng 7 năm 2017
Một vấn đề là nghĩa đen ['a','b','c']
sẽ được suy ra là kiểu string[]
, vì vậy hệ thống kiểu sẽ quên mất các giá trị cụ thể. Bạn có thể buộc hệ thống kiểu nhớ từng giá trị dưới dạng một chuỗi ký tự:
const list = ['a' as 'a','b' as 'b','c' as 'c'];
Hoặc, có thể tốt hơn, giải thích danh sách dưới dạng một loại tuple:
const list: ['a','b','c'] = ['a','b','c'];
Đây là sự lặp lại gây khó chịu, nhưng ít nhất nó không giới thiệu một đối tượng không liên quan trong thời gian chạy.
Bây giờ bạn có thể nhận được liên minh của mình như thế này:
type NeededUnionType = typeof list[number];
Hy vọng rằng sẽ giúp.