почему typescript не показывает ошибку, когда фамилия была числом?

#typescript

#typescript

Вопрос:

пытаюсь изучить typescript, например, проверку типа typescript, просто интересно, почему tsc не может определить, что фамилия является числом в следующем случае? Спасибо,

 class Student {
  constructor(public firstName, public lastName ) {
  }
}

interface Person {
  firstName : string;
  lastName : string;
}

function greeter(person : Person) {
  return "hello, "   person
}

var user = new Student("Jane", 123)

console.log('user', user)
console.log('user.lastName is', typeof user.lastName)

console.log(greeter(user))
 

Комментарии:

1. Потому Student что не реализует Person

2. но когда user используется в greeter (user), он не обнаружил, что фамилия объекта является числом, пользователь интерфейса ожидает строку, верно?

Ответ №1:

В вашем классе Student неявный тип двух свойств any :

 class Student {
  constructor(public firstName, public lastName) {
  }
}
 

… эквивалентно:

 class Student {
  public firstName: any;
  public lastName: any;
  // Here the constructor
}
 

Следовательно, экземпляры класса Student совместимы с Person , потому any что совместимы с string .

Экземпляр user может быть создан со строкой и числом из-за типа any :

 let user = new Student("Jane", 123)
 

… Тогда вы можете написать неправильный код:

 let p: Person;
p = user; // wrong code here
 

Тип any — это способ отключить проверку типов. Используйте его, если вы знаете, что делаете.

Комментарии:

1. спасибо за ответ, я меняю класс Student на have string , поэтому я получил сообщение об ошибке в этой строке:

2. здесь обновлено code:jsfiddle.net/gko4kwe6 , получил ошибку:hello2.ts(15,32): ошибка TS2345: аргумент типа ‘number’ не может быть присвоен параметру типа ‘string’. но в строке:console.log(приветствующий (пользователь)) по-прежнему нет ошибки

3. @AngeloC Неправильная строка: var user = new Student("Jane", 123) не создает неявный тип StudentBis с lastName типом number of . Он объявляет переменную user типа Student (но с ошибочным кодом). И затем, переменная типа Student совместима с типом Person .