diff options
| author | bob <bcz@cs.brown.edu> | 2019-05-31 18:18:09 -0400 | 
|---|---|---|
| committer | bob <bcz@cs.brown.edu> | 2019-05-31 18:18:09 -0400 | 
| commit | e277337aa2d8bc9528d4b512f64492113ab551f2 (patch) | |
| tree | 47ac10369f1770a26217b6d89cbe7ea237095938 /src/new_fields/Types.ts | |
| parent | d1b0f462ced168f3a9ac5d007ba1219e98a3b6cf (diff) | |
| parent | e83c2a88303ae6d994a0ac2e84214947cac4d96d (diff) | |
Merge branch 'master' into stackingviewsandmore
Diffstat (limited to 'src/new_fields/Types.ts')
| -rw-r--r-- | src/new_fields/Types.ts | 12 | 
1 files changed, 9 insertions, 3 deletions
| diff --git a/src/new_fields/Types.ts b/src/new_fields/Types.ts index 4b4c58eb8..c04dd5e6d 100644 --- a/src/new_fields/Types.ts +++ b/src/new_fields/Types.ts @@ -2,12 +2,13 @@ import { Field, Opt, FieldResult, Doc } from "./Doc";  import { List } from "./List";  import { RefField } from "./RefField"; -export type ToType<T extends ToConstructor<Field> | ListSpec<Field>> = +export type ToType<T extends ToConstructor<Field> | ListSpec<Field> | DefaultFieldConstructor<Field>> =      T extends "string" ? string :      T extends "number" ? number :      T extends "boolean" ? boolean :      T extends ListSpec<infer U> ? List<U> :      // T extends { new(...args: any[]): infer R } ? (R | Promise<R>) : never; +    T extends DefaultFieldConstructor<infer _U> ? never :      T extends { new(...args: any[]): List<Field> } ? never :      T extends { new(...args: any[]): infer R } ? R : never; @@ -19,12 +20,17 @@ export type ToConstructor<T extends Field> =      new (...args: any[]) => T;  export type ToInterface<T extends Interface> = { -    [P in Exclude<keyof T, "proto">]: FieldResult<ToType<T[P]>>; +    [P in Exclude<keyof T, "proto">]: T[P] extends DefaultFieldConstructor<infer F> ? Exclude<FieldResult<F>, undefined> : FieldResult<ToType<T[P]>>;  };  // type ListSpec<T extends Field[]> = { List: ToContructor<Head<T>> | ListSpec<Tail<T>> };  export type ListSpec<T extends Field> = { List: ToConstructor<T> }; +export type DefaultFieldConstructor<T extends Field> = { +    type: ToConstructor<T>, +    defaultVal: T +}; +  // type ListType<U extends Field[]> = { 0: List<ListType<Tail<U>>>, 1: ToType<Head<U>> }[HasTail<U> extends true ? 0 : 1];  export type Head<T extends any[]> = T extends [any, ...any[]] ? T[0] : never; @@ -34,7 +40,7 @@ export type HasTail<T extends any[]> = T extends ([] | [any]) ? false : true;  //TODO Allow you to optionally specify default values for schemas, which should then make that field not be partial  export interface Interface { -    [key: string]: ToConstructor<Field> | ListSpec<Field>; +    [key: string]: ToConstructor<Field> | ListSpec<Field> | DefaultFieldConstructor<Field>;      // [key: string]: ToConstructor<Field> | ListSpec<Field[]>;  } | 
