В JavaScript/TypeScript есть шаблон для проверки его собственного класса? Или я придумал что -то новое?Javascript

Форум по Javascript
Ответить
Anonymous
 В JavaScript/TypeScript есть шаблон для проверки его собственного класса? Или я придумал что -то новое?

Сообщение 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>

Подробнее здесь: https://stackoverflow.com/questions/796 ... r-did-i-co
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»