Использование Ramda с Typescript, передача типов

#typescript #ramda.js

Вопрос:

У меня есть эта небольшая функция, firstOrNull:

 import { propOr } from 'ramda'

export const firstOrNull = propOr(null, '0')
 

И я хочу использовать со свойством, которое возвращает QueryDocumentSnapshot<DocumentData>[]

 const organization = firstOrNull(snapshot.docs)?.data() as Organization
 

Из-за отсутствия ввода firstOrNull я получил ошибку:

Объект имеет тип «неизвестный»

Что мне нужно сделать, чтобы использовать правильный ввод в firstOrNull?

Может быть изменено на что-то подобное:

 export const firstOrNull:<T[]> = propOr<null, T, number>(null, 0)
 

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

1. npm install @types/ramda , см. Ссылку npmjs.com/package/@types/ramda

2. Я уже @types/ramda установил

3. snapshot.docs Правильно ли напечатано?

4. ДА. Он правильно напечатан с QueryDocumentSnapshot<DocumentData>[]

5. Может быть, мне нужно что-то вроде этого: export const firstOrNull:<T[]> = propOr<null, T, number>(null, 0) (я обновил свой вопрос этим)

Ответ №1:

Добавьте явный тип firstOrNull , который зависит от получаемого массива, чтобы он мог определить правильный тип:

 export const firstOrNull: <T>(arr: T[]) => T | null = propOr(null, '0')
 

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

1. Это сработало как шарм

2. Всякий @types/ramda раз, когда перестает выводить правильные типы, просто добавьте явную типизацию, чтобы решить ее. Я надеюсь, что они скоро улучшатся @types/ramda .

3. Большинство из нас в команде Ramda мало знают об TS, и мы зависим от людей, которые поддерживают эти файлы ввода. Я полагаю, что недавние изменения означают, что TS, по крайней мере, близок к тому, чтобы поддерживать более сложные подписи Ramda, но я не знаю, завершена ли она или какие есть пробелы. Я предполагаю, что те, кто поддерживает эти типы, будут признательны за помощь от тех, кто знает как Ramda, так и TS.