Я создаю универсальную функцию, чтобы проверить, есть ли у универсального объекта свойство, заданное массивом строк. Чтобы быть более конкретным:
const staticStrings = ['name', 'age', 'address', 'photoUrl'...];
const genObject = {name: 'John Doe', bar: 'Biz'...}
Не все строки foo являются ключами bar, bar может иметь больше ключей, чем foo. Обычно в JS я бы реализовал что-то вроде этого:
// This will render a component with value of genObject[ss] or null
const renderStaticStrings = (staticStrings) => (genObject) => {
return staticStrings.map((ss) => {
return genObject.hasOwnProperty(ss) ? (
genObject[ss]
) : null;
});
};
С Typescript у меня возникли проблемы с утверждением, что объект должен быть универсальным объектом и что массив строк (staticStrings) может содержать ключи объекта. Что я пробовал:
const renderStaticStrings = <T extends Object, K extends keyof T>(staticStrings: K[]) => (genObject: T) => {
return staticStrings.map((ss) => {
return genObject.hasOwnProperty(ss) ? genObject[ss] : null;
});
};
реализация:
renderStaticStrings(staticStrings)(completeProfile?.profile)}
Ошибка: Аргумент типа ‘строка []’ не может быть назначен параметру типа ‘(keyof Object) []’. Тип ‘строка’ не может быть назначен типу ‘keyof Object’
Любая идея? Спасибо
Я не считаю, что здесь необходимо использовать дженерики. Попробуй это:
да, это работает, я пробовал то же решение, но, хотя у меня есть какие-либо желания, это не такая хорошая идея … может быть полезен в этом случае, хотя — person Filippo Rivolta; 13.05.2021
anyвполне приемлемо, если у вас нет более узкого типа, который вы могли бы использовать. Если вы знаете, что значенияgenObjectбудутstring, вы можете использовать это. Если этот тип различается (иногдаstring, иногдаnumberи т. Д.), Вы можете создать общий для этого типа. — person Filippo Rivolta; 13.05.2021