Принудительный вызов .toString () для объекта при неявном преобразовании в строку - PullRequest
0 голосов
/ 01 мая 2020

Я ищу способ автоматического использования метода toString () объекта, используемого в случаях, когда он неявно преобразуется в строку. Например, скажем, у вас есть этот класс:

class Dog {
  name: string;
  constructor(name: string) {
    this.name = name;
  }
  public toString(): string {
    return `${this.name} is my friend`;
  }
}

Тогда я обнаружу, что второе из двух утверждений в этом тесте не выполнится:

test.only("Dog", () => {
  const dog = new Dog("buddy");
  expect(dog.toString()).toBe("buddy is my friend");
  expect(dog as any as string).toBe("buddy is my friend"); // fails
});

Я получаю следующую ошибку:

expect(received).toBe(expected) // Object.is equality
Expected: "buddy is my friend"
Received: {"name": "buddy"}

(Примечание: утверждение также не выполняется, если я использую .toEqual вместо .toBe.)

Я хотел бы сделать так, чтобы это утверждение прошло, т.е. когда я преобразовать Dog в строку неявным способом, подобным этому (как это может случиться в проекте TypeScript, который начал свою жизнь как проект JavaScript).

Есть предложения, если это возможно? Есть ли способ изменить класс Dog, чтобы разрешить это?

1 Ответ

0 голосов
/ 01 мая 2020
expect(dog as any as string).toBe("buddy is my friend");

as string только изменяет тип объекта в компиляторе машинописи. Он не выполняет никаких реальных преобразований типов.

Если вы проверите выходной JavaScript, вы найдете старый: expect(dog).toBe("buddy is my friend");

Простое использование .toString() может быть лучшим выбором

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...