Переопределение этого в конструкторе класса - PullRequest
0 голосов
/ 05 июня 2019

У меня есть родительский класс 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>];

Как можно решить эту проблему?

...