Напишите типобезопасную функцию, которая принимает произвольный объект и генерирует строку CSV

#typescript

#typescript

Вопрос:

Итак, я пытаюсь написать функцию в TypeScript, которая принимает произвольный PDO (определенный как interface ) и выводит строку CSV (да, я знаю, что, вероятно, смогу найти библиотеки для этого, но те, которые я нашел, на самом деле не соответствуют моим потребностям, и мне нравится писать такие вещи)

Чтобы ввести входной параметр, я начал с создания сопоставленного типа, например:

 interface ArbitraryObjectType {
   [key: string]: unknown
}
 

Однако, когда я попытался использовать это как с входным параметром, функция не приняла мой PDO (это минимальный пример, а не мой реальный код, поэтому имена, очевидно, выдуманы):

 interface ArbitraryObjectType {
   [key: string]: unknown
}


const generateCsvFromDomainPdo = (thing: ArbitraryObjectType): string => {
   // No code yet, but will eventually output a CSV string
};

interface DomainPdo {
   foo: string;
}

const bar: DomainPdo = {
   foo: "baz"
};

generateCsvFromDomainPdo(bar); /* Error: Argument of type 'DomainPdo' is not assignable to parameter 
                                         of type 'ArbitraryObjectType' */

 

Теперь мне кажется, что наиболее типобезопасным, что я, вероятно, мог бы сделать, было бы ввести аргумент as unknown , Что заставило бы сам код функции выполнять некоторую проверку пользовательских типов (защита пользовательских типов и т. Д.), Прежде чем что-либо с ним делать.

Но мне было интересно, есть ли промежуточный вариант (возможно, с использованием какой-то универсальной функции), который позволит мне передать interface объект (например, мой DomainPdo выше), который затем внутри функции предоставит мне параметр, который:

  • может быть передана в Object.keys(...) и
  • может быть проиндексирована с использованием результатов, возвращаемых тем же вызовом Object.keys(...)

Комментарии:

1. Вы не предоставили общий доступ к ArbitraryObjectPdo

2. @captain-yossarian извините. Опечатка — это должно было быть ArbitraryObjectType . Я обновил вопрос 🙂

3. Какие типы значений вы ожидаете [key: string]: unknown вместо unknown? Все возможно? Я имею в виду массивы, символы, функции или только сериализуемые?

4. Я думаю unknown , что это разумный тип для значений — я рад выполнить там проверку типов. Я спрашиваю, как я могу это сделать, не передавая все это в as unknown .

5. Итак, какой тип вы ожидаете в результате Object.keys(thing) и что вы ожидаете в качестве возвращаемого типа функции?