Воспроизведено, см. Пример в Typescript Playground с использованием конфигурации по умолчанию.
class Foo {
public firstname: string;
public lastname: string;
constructor(firstname:string, lastname:string){
this.firstname = firstname;
this.lastname = lastname;
}
public toString():string {
return this.firstname + this.lastname;
}
}
class Bar1 {
public checkThisMethod<Foo>(foo: Foo):string {
return foo.toString();
/*^^^^^^^^ Property 'toString' does not exist on type 'Foo'.(2339) */
}
}
Bar1
так не работает. Замените «Foo» на «T», и основная причина может стать более очевидной. «Foo» не относится к классу выше, но является только именем для параметра типа, который, в свою очередь, может быть чем угодно, и у всего нет метода .toString
(например, undefined
), следовательно, ошибка.
То, что вы хотели написать, я думаю, это параметр типа, который не может быть чем-либо, а вместо этого может быть только "Foo" или быть совместимым с ним. Пример правильного синтаксиса Bar2
:
class Bar2 {
public checkThisMethod<T extends Foo>(foo: T):string {
return foo.toString();
}
}
Кроме того, если параметризованный тип T
используется только один раз, он, скорее всего, избыточен и, следовательно, такой же, но простой, как Bar3
:
class Bar3 {
public checkThisMethod(foo: Foo): string {
return foo.toString();
}
}