Класс Typescript и методы publi c - PullRequest
0 голосов
/ 15 марта 2020

У меня есть класс с методом publi c, например:

class Foo {
  public firstname: string;
  public lastname: string;
  constructor(firstname:string, lastname:string){
    this.firstname = firstname;
    this.lastname = lastname;
  }
  public toString():string {
    return firstname, lastname;
  }
}
export default Foo;

Я хотел бы вызвать метод toString в другом классе, например:

import Foo from './Foo';
...
class Bar {
  ...
  public checkThisMethod(foo:Foo):string {
    ...
    foo.toString();
    ...
  }
}

I ' получаю эту ошибку:

Property 'toString' does not exist on type 'Foo'.ts(2339)

Что я делаю не так?

Если я создаю новый объект Foo внутри checkThisMethod, он работает, но я не знаю почему он не работает с аргументами метода.

class Bar {
  ...
  public checkThisMethod(foo:Foo):string {
    ...
    let some = new Foo('first','last');
    some.toString(); // It Works!
    ...
    foo.toString(); // Not Works :/
    ...
  }
}

1 Ответ

0 голосов
/ 15 марта 2020

Воспроизведено, см. Пример в 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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...