aboutsummaryrefslogtreecommitdiff
path: root/src/fields/Field.ts
diff options
context:
space:
mode:
authorTyler Schicke <tyler_schicke@brown.edu>2019-01-15 22:31:57 -0500
committerTyler Schicke <tyler_schicke@brown.edu>2019-01-15 22:31:57 -0500
commit89204d74d2a5014b4e241973b1bdb8461ed4f78c (patch)
tree4bf58acfdad603375953b2de3610dc946e569b71 /src/fields/Field.ts
parent3de39e2608e62a278b9c8cc37b53333f0877fa59 (diff)
More stuff set up
Diffstat (limited to 'src/fields/Field.ts')
-rw-r--r--src/fields/Field.ts54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/fields/Field.ts b/src/fields/Field.ts
new file mode 100644
index 000000000..46f92f203
--- /dev/null
+++ b/src/fields/Field.ts
@@ -0,0 +1,54 @@
+import { TypedEvent } from "../util/TypedEvent";
+import { FieldUpdatedArgs } from "./FieldUpdatedArgs";
+import { DocumentReference } from "./DocumentReference";
+import { Utils } from "../Utils";
+
+export function Cast<T extends Field>(field: Opt<Field>, ctor: { new(): T }): Opt<T> {
+ if (field) {
+ if (ctor && field instanceof ctor) {
+ return field;
+ }
+ }
+ return undefined;
+}
+
+export type Opt<T> = T | undefined;
+
+export abstract class Field {
+ //FieldUpdated: TypedEvent<Opt<FieldUpdatedArgs>> = new TypedEvent<Opt<FieldUpdatedArgs>>();
+
+ private id: string;
+ get Id(): string {
+ return this.id;
+ }
+
+ constructor(id: Opt<string> = undefined) {
+ this.id = id || Utils.GenerateGuid();
+ }
+
+ Dereference(): Opt<Field> {
+ return this;
+ }
+ DereferenceToRoot(): Opt<Field> {
+ return this;
+ }
+
+ DereferenceT<T extends Field = Field>(ctor: { new(): T }): Opt<T> {
+ return Cast(this.Dereference(), ctor);
+ }
+
+ DereferenceToRootT<T extends Field = Field>(ctor: { new(): T }): Opt<T> {
+ return Cast(this.DereferenceToRoot(), ctor);
+ }
+
+ Equals(other: Field): boolean {
+ return this.id === other.id;
+ }
+
+ abstract TrySetValue(value: any): boolean;
+
+ abstract GetValue(): any;
+
+ abstract Copy(): Field;
+
+} \ No newline at end of file