Как правильно имплементировать класс от интерфейса?

Не подскажите, как правильно имплементировать?

Почему-то при таком варианте ts не ругается,
хотя я ожидаю что будет ошибка, т.к. не передан 3-ий параметр.

declare interface SomeInterface {
  someMethod(str1: string, str2: string, str3: string): number;
}

@Injectable()
export class SomeClass implements SomeInterface {
  someMethod(str1: string, str2: string): number {
    return 1;
  }
}


Ответы (1 шт):

Автор решения: sailybra

В TS эти сигнатуры считаются совместимыми, потому что в JS функции могут принимать любое число аргументов, лишние просто будут проигнорированы.

Пример на JS:

const f = (a, b) => console.log(a, b);

f(1, 2); // 1, 2
f(1, 2, 3, 4, 5); // 1, 2

В TS, по этому же принципу, если типы всех определённых аргументов совпадают, то неопределённые игнорируются:

const f = (a: number, b: string) => console.log(a, b);

const g: (a: number, b: string, c: boolean) => void = f; // Валидное преобразование

const v: (a: number, b: number, c: boolean) => void = f; // Ошибка, типы аргументов не совпадают


f(1, "hello"); // 1, hello
f(1, "hello", true); // Ошибка: лишний аргумент

g(1, "hello", true); // 1, hello

В этом поведении нет ничего неправильного. Заставить наследника использовать все аргументы нельзя, но в этом и нет никакого практического смысла. С таким же успехом он мог бы объявить все аргументы, но не использовать их.

→ Ссылка