Create dynamic object type from two arrays/tuples of keys and values

I have an array of keys and a tuple of values types.

const keys = ["name", "age", "isAlive"] as const;
type Values = [string, number, boolean];

How can I use them to dynamically construct the following type?

type DesiredType = {
   name: string;
   age: number;
   isAlive: boolean;
}

I have tried:

const keys = ["name", "age", "isAlive"] as const;
type Values = [string, number, boolean];

type ObjFromArrays<K extends readonly string[], V extends any[]> = {
  [I in K[number]]: V[number];
};

type DesiredType = ObjFromArrays<typeof keys, Values>;

But it doesn’t work because it iterates on K but not on V.

4

Essentially you want ObjFromArrays<K, V> to take two data types of the same shape, where the first one K holds keys, and the second one V holds values, and you want to join them into a single object type where each key is paired with each value. The way to do this is by writing a mapped type over the relevant indices I of the K data type, and using key remapping to use K[I] as the key, and V[I] as the value. Assuming K is a tuple type, then the relevant indices are the numeric-like string keys of K corresponding to positions in the tuple. That is, if K looks like ["name", "age", "isAlive"], then the indices we want to iterate over is "0" | "1" | "2".

Here’s how we implement that:

type ObjFromArrays<
  K extends readonly string[], 
  V extends Record<keyof K, any>
> = {
    [I in `${number}` & keyof K as K[I]]: V[I];
};

Here K has been constrained to a (readonly) array of strings, while V has been constrained to have the same indices as K. You could write V extends readonly string[] also, but then you’d need to check inside your implementation that each index I of K was also a valid index of V, and do something if not. We want to prevent ["name", "age", "isAlive"] for K and something like [string] for V, where the indices don’t match. Instead, by constraining to Record<keyof K, any> we’re basically requiring that V have at least the same indices as K.

The mapped type iterates over the keys of K (keyof K) which are also (&) numeric-like strings. (`${number}`). The reason why I intersect with `${number}` is to avoid iterating over all the apparent keys of arraylike types, such as "length" and "reduce" and "forEach", etc. For each such key I, the key of the output type is K[I] and the value is V[I].

Let’s test it out:

const keys = ["name", "age", "isAlive"] as const;
type Values = [string, number, boolean];
type DesiredType = ObjFromArrays<typeof keys, Values>;
/* type DesiredType = {
    name: string;
    age: number;
    isAlive: boolean;
} */

Looks good.

Playground link to code

Trang chủ Giới thiệu Sinh nhật bé trai Sinh nhật bé gái Tổ chức sự kiện Biểu diễn giải trí Dịch vụ khác Trang trí tiệc cưới Tổ chức khai trương Tư vấn dịch vụ Thư viện ảnh Tin tức - sự kiện Liên hệ Chú hề sinh nhật Trang trí YEAR END PARTY công ty Trang trí tất niên cuối năm Trang trí tất niên xu hướng mới nhất Trang trí sinh nhật bé trai Hải Đăng Trang trí sinh nhật bé Khánh Vân Trang trí sinh nhật Bích Ngân Trang trí sinh nhật bé Thanh Trang Thuê ông già Noel phát quà Biểu diễn xiếc khỉ Xiếc quay đĩa Dịch vụ tổ chức sự kiện 5 sao Thông tin về chúng tôi Dịch vụ sinh nhật bé trai Dịch vụ sinh nhật bé gái Sự kiện trọn gói Các tiết mục giải trí Dịch vụ bổ trợ Tiệc cưới sang trọng Dịch vụ khai trương Tư vấn tổ chức sự kiện Hình ảnh sự kiện Cập nhật tin tức Liên hệ ngay Thuê chú hề chuyên nghiệp Tiệc tất niên cho công ty Trang trí tiệc cuối năm Tiệc tất niên độc đáo Sinh nhật bé Hải Đăng Sinh nhật đáng yêu bé Khánh Vân Sinh nhật sang trọng Bích Ngân Tiệc sinh nhật bé Thanh Trang Dịch vụ ông già Noel Xiếc thú vui nhộn Biểu diễn xiếc quay đĩa Dịch vụ tổ chức tiệc uy tín Khám phá dịch vụ của chúng tôi Tiệc sinh nhật cho bé trai Trang trí tiệc cho bé gái Gói sự kiện chuyên nghiệp Chương trình giải trí hấp dẫn Dịch vụ hỗ trợ sự kiện Trang trí tiệc cưới đẹp Khởi đầu thành công với khai trương Chuyên gia tư vấn sự kiện Xem ảnh các sự kiện đẹp Tin mới về sự kiện Kết nối với đội ngũ chuyên gia Chú hề vui nhộn cho tiệc sinh nhật Ý tưởng tiệc cuối năm Tất niên độc đáo Trang trí tiệc hiện đại Tổ chức sinh nhật cho Hải Đăng Sinh nhật độc quyền Khánh Vân Phong cách tiệc Bích Ngân Trang trí tiệc bé Thanh Trang Thuê dịch vụ ông già Noel chuyên nghiệp Xem xiếc khỉ đặc sắc Xiếc quay đĩa thú vị
Trang chủ Giới thiệu Sinh nhật bé trai Sinh nhật bé gái Tổ chức sự kiện Biểu diễn giải trí Dịch vụ khác Trang trí tiệc cưới Tổ chức khai trương Tư vấn dịch vụ Thư viện ảnh Tin tức - sự kiện Liên hệ Chú hề sinh nhật Trang trí YEAR END PARTY công ty Trang trí tất niên cuối năm Trang trí tất niên xu hướng mới nhất Trang trí sinh nhật bé trai Hải Đăng Trang trí sinh nhật bé Khánh Vân Trang trí sinh nhật Bích Ngân Trang trí sinh nhật bé Thanh Trang Thuê ông già Noel phát quà Biểu diễn xiếc khỉ Xiếc quay đĩa
Thiết kế website Thiết kế website Thiết kế website Cách kháng tài khoản quảng cáo Mua bán Fanpage Facebook Dịch vụ SEO Tổ chức sinh nhật