#typescript
#typescript
Вопрос:
Почему в этом фрагменте TypeScript не замечает, что MadeFromString
класс не имеет второго логического аргумента в своем конструкторе и поэтому не подходит для StringConstructable
интерфейса:
interface ComesFromString {
name: string;
}
class MadeFromString implements ComesFromString {
constructor(public name: string) {
// Returns an object of type ComesFromString / MadeFromString
}
}
interface StringConstructable {
new (n: string, w: boolean): ComesFromString;
}
function makeObj(n: StringConstructable) {
return new n('hello!', false);
}
const test1 = makeObj(MadeFromString);
Тем не менее, здесь он замечает, что MadeFromString
не вызывается логическая переменная w
:
interface ComesFromString {
name: string;
}
class MadeFromString implements ComesFromString {
constructor(public name: string) {
// Returns an object of type ComesFromString / MadeFromString
}
}
interface StringConstructable {
new (n: string): ComesFromString;
w: boolean; // ERROR
}
function makeObj(n: StringConstructable) {
return new n('hello!', false);
}
const test1 = makeObj(MadeFromString); // ERROR
Ответ №1:
Это сделано специально. При проверке совместимости функций typescript обеспечивает передачу всех правильных данных. Он не пытается убедиться, что функция что-то делает с этими данными.
Подумайте, написал ли я следующий конструктор, но ни в одной строке кода не использовался второй аргумент:
constructor(public name: string, neverUsed: boolean) {
// the variable neverUsed is not used anywhere in the constructor
}
Предположительно, вы согласны с тем, что это должно совпадать StringConstructable
. Но переменная ничего не делает. В javascript принято оставлять переменные, которые вас не интересуют; они все равно будут переданы, вы просто не получите к ним доступа. И система типов typescript поддерживает это.
Для получения дополнительной информации см. Эту страницу
Комментарии:
1. Более того, второй пример OP, приведенный в вопросе, подтверждает факт единственного аргумента — вот почему он выдает ошибку.