Je vous partage quelques astuces que j'ai rassemblées au fil du temps à force de bloquer face à certains problèmes en TypeScript 😎
x is T
function isDefined<T>(x: T | undefined | null): x is T {
return x !== null && typeof x !== 'undefined';
}
function isUndefined<T>(x: T | undefined | null): x is undefined {
return x !== null && typeof x === 'undefined';
}
function isDefinedAndNotEmpty<T>(x: T | '' | undefined | null): x is T {
return x !== null && typeof x !== 'undefined' && x !== '';
}
function foo(thing: { foo: string } | undefined) {
if (isDefined(thing)) {
console.log(thing.foo);
}
}
foo(undefined);
const thing2 = [1,2,3,undefined,null,5].filter(isDefined);
ReturnType<typeof fn>
function f(): string { return ''; }
const foo: ReturnType<f> = '';
const g = (): string => '';
const bar: ReturnType<g> = '';
function incrementCounter(counterName: string) {
return { type: 'INCREMENT_COUNTER', counterName } as const;
}
type IncrementCounter = ReturnType<incrementCounter>;
Parameters<typeof fn>
function f(f1: string) {}
const foo1: Parameters<f> = [''];
const foo2: Parameters<f>[0] = '';
const g = (g1: string) => {};
const bar1: Parameters<g> = [''];
const bar2: Parameters<g>[0] = '';
import { superComplexFunction } from 'some-lib';
const param1: Parameters<superComplexFunction>[0] = {...};
DeepPartial
type Primitive = number | string | boolean | symbol | Date; type DeepPartial<T> = { [K in keyof T]?: T[K] extends Primitive ? T[K] : DeepPartial<T[K]> };
interface Thing {
a: {
b: {
c: string;
d: string;
},
e: string;
},
f: string;
}
const foo: DeepPartial<Thing> = {
a: { b: { d: '' } }
}
Omit
interface Item {
id: string;
label: string;
createdOn: Date;
}
function createItem(newItemWithoutId: Omit<Item, 'id'>): void {}
function createItem2(newItemWithoutId: Omit<Item, 'id' | 'createdOn'>): void {}
Required
interface Item {
id?: string;
label: string;
}
function editItem(itemWithIdRequired: Required<Item>): void {}
Type
class Foo {}
class Bar extends Foo {}
function f(clazz: Type<Foo>) {}
f(Foo);
f(Bar);
Si vous êtes dans un projet Angular, vous pouvez récupérer Type comme ça :
import { Type } from '@angular/core';
Sinon je vous donne la même définition :
interface Type<T> extends Function { new (...args: any[]): T; }
Crédit photo : https://pixabay.com/photos/rubber-duck-bath-duck-toys-costume-1401225/