From f29026805f8db3ada99bd512440fea629aadfbd8 Mon Sep 17 00:00:00 2001 From: Martin Hochel Date: Fri, 22 Jun 2018 18:37:11 +0200 Subject: [PATCH] [webpack-config-utils]: add proper overrides to resolve if/else type properly --- types/webpack-config-utils/index.d.ts | 80 +++++++------------ .../webpack-config-utils-tests.ts | 24 +++--- 2 files changed, 42 insertions(+), 62 deletions(-) diff --git a/types/webpack-config-utils/index.d.ts b/types/webpack-config-utils/index.d.ts index 4f2f70a409..97c1fdf397 100644 --- a/types/webpack-config-utils/index.d.ts +++ b/types/webpack-config-utils/index.d.ts @@ -4,57 +4,37 @@ // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped // TypeScript Version: 2.8 -declare const api: WebpackConfigUtils.API; -export = api; +export function getIfUtils( + env: { [P in E]: boolean | string } | E, + vars?: Array +): IfUtils; +export function removeEmpty(input: Array): T[]; +export function removeEmpty(input: { [P in keyof T]: T[P] }): NonEmptyObject; +export function propIf(a: Falsy, value: any, alternate: E): E; +export function propIf(a: any, value: I, alternate: any): I; +export function propIfNot(a: Falsy, value: I, alternate: any): I; +export function propIfNot(a: any, value: any, alternate: E): E; -declare namespace WebpackConfigUtils { - type Falsy = false | '' | undefined | null | 0; - type DefinedObjKeys = ({ [P in keyof T]: T[P] extends undefined ? never : P })[keyof T]; - type NonEmptyObject = DefinedObjKeys> = { [PP in P]: T[PP] }; +export type Falsy = false | '' | 'false' | undefined | null | 0; +export type DefinedObjKeys = ({ [P in keyof T]: T[P] extends undefined ? never : P })[keyof T]; +export type NonEmptyObject = DefinedObjKeys> = { [PP in P]: T[PP] }; - type EnvVars = 'production' | 'prod' | 'test' | 'development' | 'dev'; - interface RemoveEmpty { - (input: Array): T[]; - (input: { [P in keyof T]: T[P] }): NonEmptyObject; - } - type GetIfUtils = ( - env: { [P in E]: boolean | string } | E, - vars?: Array - ) => IfUtils; +export type EnvVars = 'production' | 'prod' | 'test' | 'development' | 'dev'; - // @TODO - // with following defintion, generics will get flattened to base type -> string. Any ideas why or how to fix this? - // $ExpectType "value" | "alternate" - // propIf(true, 'value', 'alternate'); // 'value' - // - // type PropIf = (add: A, value: I, alternate: E) => A extends Falsy ? E : I; - // type PropIfNot = (add: A, value: I, alternate: E) => A extends Falsy ? I : E; - - type PropIf = (add: any, value: I, alternate: E) => I | E; - type PropIfNot = PropIf; - - interface IfUtilsFn { - (value: Y, alternate?: N): Y | N; - (): boolean; - } - interface IfUtils { - ifDevelopment: IfUtilsFn; - ifNotDevelopment: IfUtilsFn; - ifDev: IfUtilsFn; - ifNotDev: IfUtilsFn; - ifProduction: IfUtilsFn; - ifNotProduction: IfUtilsFn; - ifProd: IfUtilsFn; - ifNotProd: IfUtilsFn; - ifTest: IfUtilsFn; - ifNotTest: IfUtilsFn; - [key: string]: IfUtilsFn; - } - - interface API { - getIfUtils: GetIfUtils; - removeEmpty: RemoveEmpty; - propIf: PropIf; - propIfNot: PropIfNot; - } +export interface IfUtilsFn { + (value: Y, alternate?: N): Y | N; + (): boolean; +} +export interface IfUtils { + ifDevelopment: IfUtilsFn; + ifNotDevelopment: IfUtilsFn; + ifDev: IfUtilsFn; + ifNotDev: IfUtilsFn; + ifProduction: IfUtilsFn; + ifNotProduction: IfUtilsFn; + ifProd: IfUtilsFn; + ifNotProd: IfUtilsFn; + ifTest: IfUtilsFn; + ifNotTest: IfUtilsFn; + [key: string]: IfUtilsFn; } diff --git a/types/webpack-config-utils/webpack-config-utils-tests.ts b/types/webpack-config-utils/webpack-config-utils-tests.ts index 830997eb7e..4f83245b57 100644 --- a/types/webpack-config-utils/webpack-config-utils-tests.ts +++ b/types/webpack-config-utils/webpack-config-utils-tests.ts @@ -4,23 +4,23 @@ import { getIfUtils, removeEmpty, propIf, propIfNot } from 'webpack-config-utils { // propIf/propIfNot - // $ExpectType "value" | "alternate" - propIf(true, 'value', 'alternate'); // 'value' + // $ExpectType "value" + propIf(true, 'value', 'alternate'); - // $ExpectType "value" | "alternate" - propIf(false, 'value', 'alternate'); // 'alternate' + // $ExpectType "alternate" + propIf(false, 'value', 'alternate'); - // $ExpectType "value" | "alternate" - propIf('false', 'value', 'alternate'); // 'alternate' + // $ExpectType "alternate" + propIf('false', 'value', 'alternate'); - // $ExpectType "value" | "alternate" - propIfNot(true, 'value', 'alternate'); // 'alternate' + // $ExpectType "alternate" + propIfNot(true, 'value', 'alternate'); - // $ExpectType "value" | "alternate" - propIfNot(false, 'value', 'alternate'); // 'value' + // $ExpectType "value" + propIfNot(false, 'value', 'alternate'); - // $ExpectType "value" | "alternate" - propIfNot('false', 'value', 'alternate'); // 'value' + // $ExpectType "value" + propIfNot('false', 'value', 'alternate'); } { // getIfUtils