Перегрузка функции Typescript в `interface` - PullRequest
0 голосов
/ 04 марта 2020

Я впервые работаю с перегрузками в Typescript и столкнулся с некоторыми ошибками при определении их в interface.

Я думаю, что правильно понимаю концепцию, потому что эти примеры компилируются без ошибок:

function test(): void;
function test(str: string): string;

// OK
function test(str?: string) {
    if (typeof str === 'string') return str;
};

test(); // OK
test(''); // OK
class Test2 {
    public test(): void;
    public test(str: string): string;

    // OK
    public test(str?: string) {
        if (typeof str === 'string') return str;
    }

    constructor() {
        this.test(); // OK
        this.test(''); // OK
    }
}

Однако все эти броски либо:

  • Type '() => void' is not assignable to type '{ (): void; (str: string): string; }'.
  • Type '(str: string) => string' is not assignable to type '{ (): void; (str: string): string; }'.
interface Test {
    test(): void;
    test(str: string): string;
}

const test1: Test = {
    test: () => {}, // ERROR
};

const test2: Test = {
    test: (str: string) => str, // ERROR
};

class Test implements Test {
    constructor() {
        this.test = () => {}; // ERROR
        this.test = (str: string) => ''; // ERROR
    }
}

Я что-то не так делаю, или это ошибка в Typescript?

РЕДАКТИРОВАТЬ: Вот код на Typescript Playground

1 Ответ

0 голосов
/ 04 марта 2020

Ваши неудачные случаи терпят неудачу, потому что каждый раз вы назначаете реализацию, которая удовлетворяет только одной из перегруженных сигнатур функций, определенных в интерфейсе.

Это будет трудно сделать, так как вы не можете определить два свойства с одинаковым именем для любого данного объекта. Итак, как и в случае с вашей декларацией function, вам нужно предоставить одну реализацию, которая удовлетворяет обеим сигнатурам функций:

interface Test {
    test(): void;
    test(str: string): string;
}

const test: Test = {
    test: (str?: string): any => {
        if (typeof str === 'string') return str;
    }
};

class Test implements Test {
    constructor() {
        this.test = (str?: string): any => {
            if (typeof str === 'string') return str;
        }
    }
}

Как уже отмечалось здесь , указав тип возврата, который соответствует void и string нетривиально (не возможно?), поэтому необходимо использовать any.

...