Угловой 2 типа FormBuilder
Изучая Angular 2, я впервые увидел ngModel, а теперь увидел FormGroup/FormBuilder, который будет лучше создавать сложные формы. Но я заметил, что с FormBuilder мы теряем всю силу статического типа, предоставляемую TypeScript.
Все наблюдаемые и основной объект набираются как любые. Можно ли что-то сделать, чтобы этого избежать?
В связи с этим я увидел, что в TypeScript 2.1 есть "сопоставленные типы", которые, по моему мнению, были бы чем-то хорошим для преобразования стандартного интерфейса в интерфейс наблюдаемых без потери типов свойств, но я не вижу, чтобы об этом говорили Angular.
1 ответ
Формы угловые бывают двух видов
- управляемый шаблоном
а также
- реактивные формы (которые используют FormGroup/FormBuilder).
По моему мнению, реактивные формы хороши из-за возможности проверки и могут создавать динамические формы. эти две особенности делают реактивную форму более мощной.
реактивная форма ссылка Angular2 реактивная форма подтверждают равенство значений
и я думаю, что для наблюдаемых мы уже используем тип Observable <person[]> ;
для каждого объекта мы можем определить его интерфейс и использовать в компоненте.
но да, используя сопоставленные типы, мы получим больше опций, таких как readonly, прокси....
и никто не говорит о отображаемых типах, потому что это в TypeScript 2.1, но для нашего углового приложения мы используем "typescript": "~2.0.10"
для поддержания стабильности нашего приложения.
Типы карт
Одна общая задача - взять существующий тип и сделать каждое из его свойств полностью необязательным. Допустим, у нас есть `Person:
interface Person {
name: string;
age: number;
location: string;
}
Частичная версия этого будет:
interface PartialPerson {
name?: string;
age?: number;
location?: string;
}
с сопоставленными типами PartialPerson может быть записан как обобщенное преобразование для типа Person как:
type Partial<T> = {
[P in keyof T]?: T[P];
};
type PartialPerson = Partial<Person>;
Отображаемые типы создаются путем объединения литеральных типов и вычисления набора свойств для нового типа объекта. Они похожи на списки в Python, но вместо создания новых элементов в списке они создают новые свойства в типе.
В дополнение к частичным Mapped Types могут выражать много полезных преобразований типов:
// Keep types the same, but make each property to be read-only.
type Readonly<T> = {
readonly [P in keyof T]: T[P];
};
// Same property names, but make the value a promise instead of a concrete one
type Deferred<T> = {
[P in keyof T]: Promise<T[P]>;
};
// Wrap proxies around properties of T
type Proxify<T> = {
[P in keyof T]: { get(): T[P]; set(v: T[P]): void }
};