Функция Typescript, принимающая общий параметр и массив строк

Я создаю универсальную функцию, чтобы проверить, есть ли у универсального объекта свойство, заданное массивом строк. Чтобы быть более конкретным:

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’

Любая идея? Спасибо

См. также:  npm weekly # 115: объявляя о 2FA и токенах только для чтения, мы перенесли щенков на Node.js
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. Filippo Rivolta

    Я не считаю, что здесь необходимо использовать дженерики. Попробуй это:

    const renderStaticStrings = (staticStrings: string[]) => (genObject: Record<string, any>) => {
        return staticStrings.map((ss) => {
          return genObject.hasOwnProperty(ss) ? genObject[ss] : null;
        });
      };
    
    const staticStrings = ['name', 'age', 'address', 'photoUrl'];
    const genObject = {name: 'John Doe', bar: 'Biz'}
    
    renderStaticStrings(staticStrings)(genObject);
    

    да, это работает, я пробовал то же решение, но, хотя у меня есть какие-либо желания, это не такая хорошая идея … может быть полезен в этом случае, хотя person Filippo Rivolta; 13.05.2021

    any вполне приемлемо, если у вас нет более узкого типа, который вы могли бы использовать. Если вы знаете, что значения genObject будут string, вы можете использовать это. Если этот тип различается (иногда string, иногда number и т. Д.), Вы можете создать общий для этого типа. person Filippo Rivolta; 13.05.2021

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: