diff options
author | Tyler Schicke <tyler_schicke@brown.edu> | 2019-01-15 22:31:57 -0500 |
---|---|---|
committer | Tyler Schicke <tyler_schicke@brown.edu> | 2019-01-15 22:31:57 -0500 |
commit | 89204d74d2a5014b4e241973b1bdb8461ed4f78c (patch) | |
tree | 4bf58acfdad603375953b2de3610dc946e569b71 /src/fields/Field.ts | |
parent | 3de39e2608e62a278b9c8cc37b53333f0877fa59 (diff) |
More stuff set up
Diffstat (limited to 'src/fields/Field.ts')
-rw-r--r-- | src/fields/Field.ts | 54 |
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 |