Я создаю универсальную функцию, чтобы проверить, есть ли у универсального объекта свойство, заданное массивом строк. Чтобы быть более конкретным:
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