Вы можете поместить следующий код в файл foo.ts. Я пытаюсь динамически генерировать типы. То, что я делаю, основано на этом вопросе: Map array to interface
type TypeMapping = {
Boolean: boolean,
String: string,
Number: number,
ArrayOfString: Array<string>,
}
export enum Type {
Boolean = 'Boolean',
String = 'String',
Number = 'Number',
ArrayOfString = 'ArrayOfString'
}
const asOptions = <K extends Array<string>, T extends Array<{ name: K, type: keyof TypeMapping }>>(t: T) => t;
type OptionsToType<T extends Array<{ name: Array<string>, type: keyof TypeMapping }>>
= { [K in T[number]['name'][0]]: TypeMapping[Extract<T[number], { name: K }>['type']] }
const options = asOptions([
{
name: ['foo'],
type: Type.Boolean
},
{
name: ['bar'],
type: Type.String
},
{
name: ['baz'],
type: Type.Number
},
{
name: ['bab'],
type: Type.ArrayOfString
}
]);
export type Opts = OptionsToType<typeof options>;
const v = <Opts>{foo: true}; // this does not compile
console.log(typeof v.foo);
Я не получаю завершения типа - когда я набираю v.
, ничего не появляется.
name
массивом? В вашем примере используется только одноэлементный массив (один кортеж)... если это всегда только один элемент, почему бы вместо этого не использовать просто строку? Если иногда это более одного элемента, можете ли вы показать, как вы хотите его использовать? - person jcalz   schedule 05.09.2018