TRen208
@TRen208

[TypeScript] Можно ли создать тип из ключей объекта?

Возможно ли сделать так, чтобы типы T1 и T2 содержали такие "ключи" на основе объектов?


Есть такой код:
type Args = {
    [key: string]: {
        RegExp: [string, boolean],
        description: string
    }
}
let a1: Args = {
    channelID: {
        RegExp: ["\\d+", true],
        description: "d1"
    },
    content: {
        RegExp: [".+", true],
        description: "d2"
    }
}
let a2: Args = {
    messageID: {
        RegExp: ["\\d+", true],
        description: "d1"
    }
}


Возможно ли на основе a1 и a2 автоматически создавать такие типы?
type T1 = {
    channelID: string
    content: string
}
type T2 = {
    messageID: string
}
  • Вопрос задан
  • 79 просмотров
Решения вопроса 1
Aetae
@Aetae
Тлен
Можно, если им явно не указать тип Args, но тогда вы теряете предварительную проверку, увы:
let a1 = {
    channelID: {
        RegExp: ["\\d+", true],
        description: "d1"
    },
    content: {
        RegExp: [".+", true],
        description: "d2"
    }
};
type T1 = {[K in keyof typeof a1]: string}


Чтобы сохранить проверку - придётся воспользоваться дополнительной бессмысленной функцией для уточнения типа:
type Args = {
    [key: string]: {
        RegExp: [string, boolean],
        description: string
    }
}
function createArgs<T extends Args>(args: T): T {
    return args;
}

type TStringKeys<T extends Args> = {[K in keyof T]: string};


let a1 = createArgs({
    channelID: {
        RegExp: ["\\d+", true],
        description: "d1"
    },
    content: {
        RegExp: [".+", true],
        description: "d2"
    }
});

type T1 = TStringKeys<typeof a1>
К сожалению на текущий момент(ts4.2.3) избавиться от функции-обёртки не получится.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы