Добавьте отсутствующие типы в Angular и упростите кодирование

Я заметил два распространенных случая, когда Angular использует any вместо правильного типа. При использовании any нам не хватает функций безопасности типов и автозаполнения TypeScript.

Я написал эти фрагменты, чтобы сделать эти случаи строго типизированными, и, поскольку они хорошо работают, я решил поделиться ими.

Типизированные простые изменения (ngOnChanges)

Возможно, это временное исправление, так как PR находится на рассмотрении (отправлено в феврале 2018 г.).

import { SimpleChange } from '@angular/core';
export type TypedSimpleChanges<T> = {
  [P in keyof T]: SimpleChange;
};

Использование:

ngOnChanges(changes: TypedSimpleChanges<MyClass>) {
  if (changes.myProp && changes.myProp.isFirstChange()) {
  ...
  }
}

Типизированная группа форм

import { FormGroup } from '@angular/forms';
export interface TypedFormGroup<T> extends FormGroup {
  readonly value: Partial<T>;
}

Использование:

form: TypedFormGroup<ContactRequest>;
// Now this.form.value type is ContactRequest

Создать типизированную группу форм

import { ValidatorFn } from '@angular/forms';
export type TypedControlsConfig<T> = {
  [key in keyof T]?: T[key] | [T[key]] | [T[key], Array<ValidatorFn>];
};
export function createForm<T>(fb: FormBuilder, fields: TypedControlsConfig<T>): TypedFormGroup<T> {
  return fb.group(fields);
}

Использование:

this.form = createForm<ContactRequest>(this.fb, {
 fullName: [null, [Validators.required]],
 email: [null, [Validators.required, Validators.email]],
 message: [null, [Validators.required, Validators.maxLength(200)]]
});

Надеюсь, вы найдете эти фрагменты полезными.

Подпишитесь на Front End Beyond для получения дополнительных статей, связанных с интерфейсом.