#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(приветствующий (пользователь)) по-прежнему нет ошибки