#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
, что это разумный тип для значений — я рад выполнить там проверку типов. Я спрашиваю, как я могу это сделать, не передавая все это в asunknown
.5. Итак, какой тип вы ожидаете в результате
Object.keys(thing)
и что вы ожидаете в качестве возвращаемого типа функции?