Тип '() => void' нельзя назначить типу () => {}'
Я понимаю сообщение об ошибке:
Тип '() => void' нельзя назначить типу () => {}'
Ну вроде, это говорит мне, что есть проблема приведения типов. Однако я не могу понять, почему компилятор считает, что типы не совпадают.
Основой для кода является то, что у меня есть класс машинописного текста, который получает функцию, а затем сохраняет ее как член. Я хочу иметь возможность инициализировать элемент с пустой функцией 'noop', чтобы он не проверял его перед использованием.
Мне удалось свести проблему к следующему примеру тестового кода:
export class Test {
private _noop: () => {};
constructor(
) {
this._noop = () => { }; //I guess the compiler thinks this is returning in a new empty object using the json syntax
this._noop = this.noop; //I would have thought this shoud definitely work
this._noop = () => undefined; //This does works
}
public noop(): void {
//Nothing to see here...
}
}
Все три оператора в конструкторе предназначены для выполнения одной и той же работы: инициализировать элемент функцией без операции. Однако работает только последнее утверждение:
this._noop = () => undefined;
Два других оператора приводят к ошибке компиляции.
Кто-нибудь знает, почему компилятор не может соответствовать типам?
2 ответа
В вашем определении private _noop: () => {};
_noop
типизируется как функция, возвращающая объект.
Когда вы назначаете его как this._noop = () => { };
функция, которую вы пытаетесь назначить _noop
имеет тип () => void
,
Если бы вы хотели _noop
чтобы быть функцией, ничего не возвращающей, наберите ее как:
private _noop: () => void;
Приведенное ниже определение означает, что _noop - это функция, которая должна возвращать объект (включая undefined и null).
private _noop: () => {};
это равно:
private _noop: () => Object;
Вы можете заставить все три утверждения работать с:
private _noop: () => any;
или первое утверждение будет работать с обоими из них:
this._noop = () => ({});
this._noop = () => { return {} };