From 5a9e437bbd175b36a161e1d96c8ae873dfe6d105 Mon Sep 17 00:00:00 2001 From: Tyler Schicke Date: Mon, 22 Apr 2019 03:39:39 -0400 Subject: More --- src/new_fields/Types.ts | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) (limited to 'src/new_fields/Types.ts') diff --git a/src/new_fields/Types.ts b/src/new_fields/Types.ts index f4f66fe5c..fbf002c84 100644 --- a/src/new_fields/Types.ts +++ b/src/new_fields/Types.ts @@ -1,25 +1,28 @@ import { Field, Opt, FieldWaiting, FieldResult } from "./Doc"; import { List } from "./List"; -export type ToType = +export type ToType | ListSpec> = T extends "string" ? string : T extends "number" ? number : T extends "boolean" ? boolean : T extends ListSpec ? List : // T extends { new(...args: any[]): infer R } ? (R | Promise) : never; + T extends { new(...args: any[]): List } ? never : T extends { new(...args: any[]): infer R } ? R : never; -export type ToConstructor = +export type ToConstructor = T extends string ? "string" : T extends number ? "number" : - T extends boolean ? "boolean" : new (...args: any[]) => T; + T extends boolean ? "boolean" : + T extends List ? ListSpec : + new (...args: any[]) => T; -export type ToInterface = { +export type ToInterface = { [P in keyof T]: ToType; }; -// type ListSpec = { List: FieldCtor> | ListSpec> }; -export type ListSpec = { List: FieldCtor }; +// type ListSpec = { List: ToContructor> | ListSpec> }; +export type ListSpec = { List: ToConstructor }; // type ListType = { 0: List>>, 1: ToType> }[HasTail extends true ? 0 : 1]; @@ -34,11 +37,9 @@ export interface Interface { // [key: string]: ToConstructor | ListSpec; } -export type FieldCtor = T extends List ? ListSpec : ToConstructor; - -export function Cast>(field: Field | FieldWaiting | undefined, ctor: T): FieldResult>; -export function Cast>(field: Field | FieldWaiting | undefined, ctor: T, defaultVal: ToType): ToType; -export function Cast>(field: Field | FieldWaiting | undefined, ctor: T, defaultVal?: ToType): FieldResult> | undefined { +export function Cast | ListSpec>(field: Field | FieldWaiting | undefined, ctor: T): FieldResult>; +export function Cast | ListSpec>(field: Field | FieldWaiting | undefined, ctor: T, defaultVal: ToType): ToType; +export function Cast | ListSpec>(field: Field | FieldWaiting | undefined, ctor: T, defaultVal?: ToType): FieldResult> | undefined { if (field instanceof Promise) { return defaultVal === undefined ? field.then(f => Cast(f, ctor) as any) : defaultVal; } @@ -58,7 +59,9 @@ export function Cast>(field: Field | FieldWaiting | u return defaultVal; } -export function FieldValue(field: Opt | Promise>, defaultValue: U): T; +type WithoutList = T extends List ? R[] : T; + +export function FieldValue>(field: Opt | Promise>, defaultValue: U): WithoutList; export function FieldValue(field: Opt | Promise>): Opt; export function FieldValue(field: Opt | Promise>, defaultValue?: T): Opt { return field instanceof Promise ? defaultValue : field; -- cgit v1.2.3-70-g09d2