Executando verificação de segurança...
0
lucax
1 min de leitura ·

[TypeScript][Ajuda]

Poderiam me ajudar a melhorar esse código?

O meu objetivo com essa função é poder fazer um get em qualquer collection do banco de dados a partir de uma Unique-Key.

O meu maior problema foi com a tipagem dessa função.

(Os nomes das variaveis tbm n são os melhores)

import { db } from "@/db"
import { TransactionInterface, UserInterface } from "@/interfaces"

type CollectionsData = {
	users: UserInterface
	transactions: TransactionInterface
}

type UniqueUserKeys = Pick<UserInterface, "_id" | "email">
type UniqueTransactionKeys = Pick<TransactionInterface, "_id" | "userId">

type RequireOnlyOne<T, Keys extends keyof T = keyof T> = Pick<
	T,
	Exclude<keyof T, Keys>
> &
	{
		[K in Keys]-?: Required<Pick<T, K>> &
			Partial<Record<Exclude<Keys, K>, undefined>>
	}[Keys]

type UniqueCollectionsKeys = {
	users: RequireOnlyOne<UniqueUserKeys>
	transactions: RequireOnlyOne<UniqueTransactionKeys>
}

type UniqueCollectionsKeysData = {
	[Key in keyof UniqueCollectionsKeys]: {
		collectionName: Key
		uniqueKey: UniqueCollectionsKeys[Key]
	}
}[keyof UniqueCollectionsKeys]

const getByUnique = async <T extends keyof CollectionsData>(
	collection: UniqueCollectionsKeysData
): Promise<CollectionsData[T] | null> => {
	const result = await db
		.collection(collection.collectionName)
		.findOne(collection.uniqueKey)
	return result || null
}

export default {
	getByUnique,
}

Carregando publicação patrocinada...