Как правильно имплементировать класс от интерфейса?
Не подскажите, как правильно имплементировать?
Почему-то при таком варианте 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
В этом поведении нет ничего неправильного. Заставить наследника использовать все аргументы нельзя, но в этом и нет никакого практического смысла. С таким же успехом он мог бы объявить все аргументы, но не использовать их.