typcript - значение по умолчанию для экземпляра класса - PullRequest
0 голосов
/ 08 октября 2019

Мне было интересно, существует ли эта функция в Typescript:

Если у меня был класс

class Person {
  name: string
  age: number
  constructor(name, age){
    this.name = name
    this.age = age
  }
}

, и я хотел, чтобы он возвращал какое-то значение по умолчанию, когда экземпляр вызывается

const person = new Person('Jim', 28)
console.log(person)
//> Jim

Как добиться возврата пользовательского значения / значения по умолчанию, если экземпляр вызывается без доступа к его свойствам или методам? Есть ли ключевое слово, которое может заставить свойство действовать таким образом? Я мог бы представить ключевое слово «по умолчанию», но есть ли что-то похожее?

class Person {
  default name: string
  age: number
  constructor(name, age){
    this.name = name
    this.age = age
  }
}

1 Ответ

1 голос
/ 08 октября 2019

Самое близкое - переопределить методы toString и / или valueOf, унаследованные от Object.prototype. Но : console.log не использует их в большинстве реализаций, вам придется сделать console.log(String(person)) или аналогичный.

Например, toString:

class Person {
  name: string;
  age: number;
  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }
  toString(): string {
    return this.name;
  }
}

Пример Live (JavaScript, Версия TypeScript на игровой площадке ):

class Person {
  constructor(name, age) {
    this.name = name
    this.age = age
  }
  toString() {
    return this.name;
  }
}
const person = new Person('Jim', 28);
console.log(String(person));

Аналогично, если вы переопределите valueOf и вернете число, то при использовании числового оператора с вашим экземпляром будет использоваться число valueOf, возвращаемое:

class Person {
  constructor(name, age) {
    this.name = name
    this.age = age
  }
  valueOf() {
    return this.age;
  }
}
const person = new Person('Jim', 28);
console.log(person + 4); // 32

valueOf может вернуть что угодно (включая строку), хотя, если он возвращает не примитив, этот объект будет преобразован в примитив обычным способом для этогоobject.


Примечание: вы можете сэкономить некоторое время при наборе текста, используя автоматическое объявление свойства TypeScript:

class Person {
  constructor(public name: string, public age: number) {
  }
  toString(): string {
    return this.name;
  }
}

public в списке параметров для конструктора сообщает TypeScript:создайте их как публичные свойства и назначьте их в коде конструктора.

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