Тип '() => 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 {} };
Другие вопросы по тегам