Использование any
по существу требует от компилятора никогда не выдавать вам ошибку; любое значение может быть присвоено типу any
, а тип any
может быть назначен любому другому типу, поэтому вы можете написать createObject("hello", "goodbye");
и не получить ошибки от компилятора.
Чтобы начать принудительное исполнение некоторая безопасность типов, вы хотите, чтобы аргумент ClassName
имел сигнатуру вызова конструктора; то есть это должно быть « newable » с одним аргументом. Что-то вроде ClassName: new (arg: any) => any
.
Чтобы представить ограничение, что аргумент ClassName
имеет тот же тип, что и constructorProps
, функция createObject()
должна быть generi c в этом типе. Также поможет, если вы сделаете его generi c в возвращаемом типе конструктора, чтобы компилятор понимал, что получается из createObject()
.
Вот как я бы написал типизацию:
const createObject = <A, T>(ClassName: new (arg: A) => T, constructorProps: A) => {
return new ClassName(constructorProps);
}
Теперь вы должны получить более разумное поведение:
const obj = createObject(Class, { name: '' }) // error!
const betterObj = createObject(Class, { text: "" }); // okay
// const betterObj: Class
Компилятор жалуется, если вы не передаете IProps
, и он знает, что выходит экземпляр Class
.
Хорошо, надеюсь, что это поможет; удачи!
Детская площадка ссылка на код