Рассмотрим следующий код: < /p>
import type { Account } from "@/models/account";
import { fromAccountToFirebase, fromFirebaseToAccount } from "@/scripts/common/map-firestore-account";
import { ImplFirestoreStorage } from "@/services/impl/impl-firestore-storage";
import type { StorageService } from "@/services/interfaces/storage-service";
import type { User } from "firebase/auth";
import { limit, where, type DocumentData, type Firestore } from "firebase/firestore/lite";
import { filter, from, map, type Observable } from "rxjs";
/** from storage-service.ts */
// base for any data mapped to an id.
export interface SupportsId {
readonly id: ID;
}
export interface StorageService {
/** gets the first value with the matching id, if no value is found becomes empty. */
getById(id: ID): Observable;
/** gets all matches that pass the filter for the max amount of entries to find, an optional
* start index will skip the first entries.
*/
getFiltered(filter: (value: T) => boolean, maxCount: number, startIdx?: number): Observable;
/** write the value into the database and raises an error if write fails. */
update(value: T): Observable;
}
/** from impl-firestore-storage.ts */
export abstract class ImplFirestoreStorage implements StorageService {
// implementation for the required methods.
public getByQuery(...constraints: QueryConstraint[]): Observable { /** ... */ }
}
/** from impl-sql-storage.ts */
export abstract class ImplSqlStorage implements StorageService {
// implementation for the required methods.
}
/** from account-storage-service.ts */
export class AccountsStorageService extends ImplFirestoreStorage {
/** get the account data from the matching user registered with the account. */
public getByUser(user: User): Observable {
if (this instanceof ImplFirestoreStorage) {
// use more optimized query if using firestore.
return from(this.getByQuery(limit(1), where("userId", "==", user.uid))).pipe(
filter(array => array.length !== 0),
map(array => array[0]));
}
// fallback with the generic query method.
return (this as StorageService).getFiltered(account => account.userId === user.uid, 1).pipe(
filter(array => array.length !== 0),
map(array => array[0]));
}
}
< /code>
В этом коде есть общая подпись базы данных, называемая Storages service, которая обеспечивает наличие некоторого метода, тогда AccestSstorageservice - это глобальный класс для взаимодействия с базой данных учетных записей. Почему мне это нравится? В этом проекте мы переключаемся между использованием базы данных Firestore или Classic SQL, и сумели сделать реализацию для обоих. Не спрашивайте об этом. Мне пришлось использовать этот кастинг, чтобы сражаться снова, который будет отмечен после того, как экземпляр как никогда.
Я представляю, что в компиляцию /время сценария будет оптимизирован для использования содержания IF, If напрямую. Это вопрос.
Эта вещь, которую я написал, работает отлично! < /P>
Подробнее здесь: https://stackoverflow.com/questions/796 ... r-did-i-co
В JavaScript/TypeScript есть шаблон для проверки его собственного класса? Или я придумал что -то новое? ⇐ Javascript
Форум по Javascript
1750581040
Anonymous
Рассмотрим следующий код: < /p>
import type { Account } from "@/models/account";
import { fromAccountToFirebase, fromFirebaseToAccount } from "@/scripts/common/map-firestore-account";
import { ImplFirestoreStorage } from "@/services/impl/impl-firestore-storage";
import type { StorageService } from "@/services/interfaces/storage-service";
import type { User } from "firebase/auth";
import { limit, where, type DocumentData, type Firestore } from "firebase/firestore/lite";
import { filter, from, map, type Observable } from "rxjs";
/** from storage-service.ts */
// base for any data mapped to an id.
export interface SupportsId {
readonly id: ID;
}
export interface StorageService {
/** gets the first value with the matching id, if no value is found becomes empty. */
getById(id: ID): Observable;
/** gets all matches that pass the filter for the max amount of entries to find, an optional
* start index will skip the first entries.
*/
getFiltered(filter: (value: T) => boolean, maxCount: number, startIdx?: number): Observable;
/** write the value into the database and raises an error if write fails. */
update(value: T): Observable;
}
/** from impl-firestore-storage.ts */
export abstract class ImplFirestoreStorage implements StorageService {
// implementation for the required methods.
public getByQuery(...constraints: QueryConstraint[]): Observable { /** ... */ }
}
/** from impl-sql-storage.ts */
export abstract class ImplSqlStorage implements StorageService {
// implementation for the required methods.
}
/** from account-storage-service.ts */
export class AccountsStorageService extends ImplFirestoreStorage {
/** get the account data from the matching user registered with the account. */
public getByUser(user: User): Observable {
if (this instanceof ImplFirestoreStorage) {
// use more optimized query if using firestore.
return from(this.getByQuery(limit(1), where("userId", "==", user.uid))).pipe(
filter(array => array.length !== 0),
map(array => array[0]));
}
// fallback with the generic query method.
return (this as StorageService).getFiltered(account => account.userId === user.uid, 1).pipe(
filter(array => array.length !== 0),
map(array => array[0]));
}
}
< /code>
В этом коде есть общая подпись базы данных, называемая Storages service, которая обеспечивает наличие некоторого метода, тогда AccestSstorageservice - это глобальный класс для взаимодействия с базой данных учетных записей. Почему мне это нравится? В этом проекте мы переключаемся между использованием базы данных Firestore или Classic SQL, и сумели сделать реализацию для обоих. Не спрашивайте об этом. Мне пришлось использовать этот кастинг, чтобы сражаться снова, который будет отмечен после того, как экземпляр как никогда.
Я представляю, что в компиляцию /время сценария будет оптимизирован для использования содержания IF, If напрямую. Это вопрос.
Эта вещь, которую я написал, работает отлично! < /P>
Подробнее здесь: [url]https://stackoverflow.com/questions/79674991/in-javascript-typescript-theres-a-pattern-for-checks-his-own-class-or-did-i-co[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия