Я не уверен на 100%, что вы пытаетесь сделать, но мой инстинкт состоит в том, чтобы написать mapToPlainObject
вот так:
const mapToPlainObject = <T extends Partial<BACKEND_PRIMITIVE>>(
attribute: T
): T[keyof T] => {
return attribute[(Object.keys(attribute) as Array<keyof T>)[0]];
};
Здесь я говорю, что вы пройдете что-то, что имеет некоторые свойства BACKEND_PRIMITIVE
(я думаю, это всегда будет ровно одно такое свойство), и оно возвращает одно из них (и если есть ровно одно, то оно возвращает это). (Обратите внимание, что Object.keys()
возвращает string[]
в TypeScript, но я утверждаю, что это будет массив известных ключей типа attribute
. Это технически небезопасно, но я предполагаю, что ваш ввод будет не иметь в нем дополнительных неожиданных ключей.
Это дает указанное вами соотношение ввода / вывода, а компилятор знает тип вывода:
const str = mapToPlainObject({ "S": "2015-02-18T20:27:36.165Z" });
// const str: string;
console.log(str); // "2015-02-18T20:27:36.165Z"
const num = mapToPlainObject({ "N": 10 });
// const num: number;
console.log(num); // 10
У вас могут быть другие варианты использования это требует более сложной подписи типа; если да, добавьте их в вопрос, чтобы их можно было решить. В противном случае, надеюсь, что это поможет; удачи!
Ссылка на код