У меня есть родительский класс Form и дочерний класс UserForm, который расширяет форму. Я хочу иметь возможность:
- передать объект key-valaue данных в конструктор UserForm (и иметь intellinsense, который охватывает только поля UserForm)
- иметь все поля данных в качестве свойств для экземпляра UserForm
Это должно быть в строгом режиме.
Пример:
class UserForm extends Form{
name: string;
email: string;
age: number;
}
const userForm = new UserForm({ // pass only fields from UserForm: name, age, email
age: 23,
random: 123 // error. GOOD
});
console.log(userForm.age); // this needs to print 23
Мне удалось заставить его работать с кодом ниже (также, на эта ссылка ), но я не могу заставить его работать в строгом режиме:
type Without<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>
type FormFields<T extends Form<T>> = Partial<Without<T, keyof Form<T>>>;
abstract class Form<T extends Form<T>> {
constructor(data: FormFields<T>) {
Object.keys(data).forEach(field => {
this[field] = data[field as keyof FormFields<T>];
});
}
}
class UserForm extends Form<UserForm>{
name: string;
email: string;
age: number;
}
const userForm = new UserForm({
age: 23,
random: 123 // error. GOOD
})
Если вы активируете строгий режим на детской площадке, вы получите Element implicitly has an 'any' type because type 'Form<T>' has no index signature
на линии this[field] = data[field as keyof FormFields<T>];
Как можно решить эту проблему?