From 075870fae19413e0bcf8e81133026b5ff3ba9273 Mon Sep 17 00:00:00 2001 From: ilyakhd <14272298+IlyaKhD@users.noreply.github.com> Date: Fri, 30 Sep 2022 14:58:55 +0400 Subject: [PATCH] Add more scalar types --- js/core/index.d.ts | 2 +- testing/typescript/core.ts | 229 +++++++++++++++++++++---------------- 2 files changed, 134 insertions(+), 97 deletions(-) diff --git a/js/core/index.d.ts b/js/core/index.d.ts index c5d0a603569e..758ae06028e3 100644 --- a/js/core/index.d.ts +++ b/js/core/index.d.ts @@ -19,7 +19,7 @@ export type Xor> | Seal>; -type Scalar = string | number | Function | Date | Boolean | Array; +export type Scalar = undefined | null | string | String | number | Number | bigint | BigInteger | boolean | Boolean | Date | Function | Symbol | Array; export type DeepPartial = T extends Scalar ? T : { [P in keyof T]?: DeepPartial; }; diff --git a/testing/typescript/core.ts b/testing/typescript/core.ts index 1e80a61289e5..de7ed15a1c84 100644 --- a/testing/typescript/core.ts +++ b/testing/typescript/core.ts @@ -1,107 +1,144 @@ +/* eslint-disable import/no-duplicates */ +/* eslint-disable import/first */ /* eslint-disable @typescript-eslint/no-unused-vars */ /* eslint-disable @typescript-eslint/no-type-alias */ -import { - PropertyType, -} from '../../js/core'; +/* eslint-disable @typescript-eslint/consistent-type-definitions */ +/* eslint-disable @typescript-eslint/ban-types */ +/* eslint-disable no-inner-declarations */ import { assertType, toAssertion, } from './consts'; -type ComplexType = { - a: { - b?: number | { - c: boolean; - }; +import { Scalar } from '../../js/core'; + +{ + interface TestInterface { i: any } + class TestClass { c: any; } + type TestType = { t: any }; + function testFunction() {} + + const scalar1: String extends Scalar ? true : false = true; + const scalar2: string extends Scalar ? true : false = true; + const scalar3: number extends Scalar ? true : false = true; + const scalar4: Number extends Scalar ? true : false = true; + const scalar5: bigint extends Scalar ? true : false = true; + const scalar6: BigInteger extends Scalar ? true : false = true; + const scalar7: Date extends Scalar ? true : false = true; + const scalar8: boolean extends Scalar ? true : false = true; + const scalar9: Boolean extends Scalar ? true : false = true; + const scalar10: null extends Scalar ? true : false = true; + const scalar11: undefined extends Scalar ? true : false = true; + const scalar12: Symbol extends Scalar ? true : false = true; + const scalar13: [] extends Scalar ? true : false = true; + const scalar14: (() => {}) extends Scalar ? true : false = true; + const scalar15: typeof testFunction extends Scalar ? true : false = true; + const scalar16: Symbol extends Scalar ? true : false = true; + + const nonScalar1: TestInterface extends Scalar ? true : false = false; + const nonScalar2: TestClass extends Scalar ? true : false = false; + const nonScalar3: TestType extends Scalar ? true : false = false; + const nonScalar4: object extends Scalar ? true : false = false; +} + +import { PropertyType } from '../../js/core'; + +{ + type ComplexType = { + a: { + b?: number | { + c: boolean; + }; + x: number; + } | { e: string }; + } + | string + | { + d: boolean | string; + f: string | { + g: number | Record; + }[]; + }; + + type AExpected = { + b?: BExpected; x: number; } | { e: string }; + type BExpected = number | { c: boolean }; + type FExpected = string | { g: GExpected }[]; + type GExpected = number | Record; + + const a1: AExpected = { + e: 'e', + }; + const a2: AExpected = { + x: 42, + }; + const a3: AExpected = { + x: 42, + b: 1, + }; + const a4: AExpected = { + x: 42, + b: { + c: false, + }, + }; + + assertType(toAssertion(a1)); + assertType>(toAssertion(a1)); + assertType(toAssertion(a2)); + assertType>(toAssertion(a2)); + assertType(toAssertion(a3)); + assertType>(toAssertion(a3)); + assertType(toAssertion(a4)); + assertType>(toAssertion(a4)); + + const b1: BExpected = 42; + const b2: BExpected = { c: false }; + assertType(toAssertion(b1)); + assertType>(toAssertion(b1)); + assertType, 'b'>>(toAssertion(b1)); + assertType(toAssertion(b2)); + assertType>(toAssertion(b2)); + assertType, 'b'>>(toAssertion(b2)); + + assertType(toAssertion(false)); + assertType>(toAssertion(false)); + assertType < PropertyType, 'b'>, 'c'>>(toAssertion(false)); + assertType(toAssertion(true)); + assertType>(toAssertion(true)); + assertType < PropertyType, 'b'>, 'c'>>(toAssertion(true)); + + assertType(toAssertion(true)); + assertType>(toAssertion(true)); + assertType(toAssertion(false)); + assertType>(toAssertion(false)); + assertType(toAssertion('some string')); + assertType>(toAssertion('some string')); + + assertType(toAssertion('some string')); + assertType>(toAssertion('some string')); + assertType, 'e'>>(toAssertion('some string')); + + const f1: FExpected = 'some string'; + const f2: FExpected = [{ g: 42 }]; + const f3: FExpected = [{ g: { 1: false, 2: false, 3: true } }]; + + assertType(toAssertion(f1)); + assertType>(toAssertion(f1)); + assertType(toAssertion(f2)); + assertType>(toAssertion(f2)); + assertType(toAssertion(f3)); + assertType>(toAssertion(f3)); + + const g1: GExpected = 42; + const g2: GExpected = { 1: false, 2: false, 3: true }; + assertType(toAssertion(g1)); + assertType>(toAssertion(g1)); + assertType, 'g'>>(toAssertion(g1)); + assertType(toAssertion(g2)); + assertType>(toAssertion(g2)); + assertType, 'g'>>(toAssertion(g2)); } -| string -| { - d: boolean | string; - f: string | { - g: number | Record; - }[]; -}; - -type AExpected = { - b?: BExpected; - x: number; -} | { e: string }; -type BExpected = number | { c: boolean }; -type FExpected = string | { g: GExpected }[]; -type GExpected = number | Record; - -const a1: AExpected = { - e: 'e', -}; -const a2: AExpected = { - x: 42, -}; -const a3: AExpected = { - x: 42, - b: 1, -}; -const a4: AExpected = { - x: 42, - b: { - c: false, - }, -}; - -assertType(toAssertion(a1)); -assertType>(toAssertion(a1)); -assertType(toAssertion(a2)); -assertType>(toAssertion(a2)); -assertType(toAssertion(a3)); -assertType>(toAssertion(a3)); -assertType(toAssertion(a4)); -assertType>(toAssertion(a4)); - -const b1: BExpected = 42; -const b2: BExpected = { c: false }; -assertType(toAssertion(b1)); -assertType>(toAssertion(b1)); -assertType, 'b'>>(toAssertion(b1)); -assertType(toAssertion(b2)); -assertType>(toAssertion(b2)); -assertType, 'b'>>(toAssertion(b2)); - -assertType(toAssertion(false)); -assertType>(toAssertion(false)); -assertType < PropertyType, 'b'>, 'c'>>(toAssertion(false)); -assertType(toAssertion(true)); -assertType>(toAssertion(true)); -assertType < PropertyType, 'b'>, 'c'>>(toAssertion(true)); - -assertType(toAssertion(true)); -assertType>(toAssertion(true)); -assertType(toAssertion(false)); -assertType>(toAssertion(false)); -assertType(toAssertion('some string')); -assertType>(toAssertion('some string')); - -assertType(toAssertion('some string')); -assertType>(toAssertion('some string')); -assertType, 'e'>>(toAssertion('some string')); - -const f1: FExpected = 'some string'; -const f2: FExpected = [{ g: 42 }]; -const f3: FExpected = [{ g: { 1: false, 2: false, 3: true } }]; - -assertType(toAssertion(f1)); -assertType>(toAssertion(f1)); -assertType(toAssertion(f2)); -assertType>(toAssertion(f2)); -assertType(toAssertion(f3)); -assertType>(toAssertion(f3)); - -const g1: GExpected = 42; -const g2: GExpected = { 1: false, 2: false, 3: true }; -assertType(toAssertion(g1)); -assertType>(toAssertion(g1)); -assertType, 'g'>>(toAssertion(g1)); -assertType(toAssertion(g2)); -assertType>(toAssertion(g2)); -assertType, 'g'>>(toAssertion(g2));