TypeScript 中的 .valueOf() 和 .toString()

Cro*_*row 7 typescript

在 TypeScript 中是否有“正确”的使用.valueOf()and方法.toString()

export default class Measure extends Number implements Number {
  public symbol = ''
  constructor(value: number | string | Measure, symbol?: string) {
    super(value)
    if (symbol) {
      this.symbol = symbol
    }
  }

  public valueOf = (): number => {
    return parseFloat(this.toPrecision(12))
  }

  public toString = (): string => {
    return String(this.valueOf()) + this.symbol
  }
}
Run Code Online (Sandbox Code Playgroud)

.valueOf()

  • Number() 有效;
  • +作品;
  • 在数字环境中工作;
  • ts-lint 抱怨;

.toString()

  • String() 有效;
  • 在字符串上下文中不起作用;
  • ts-lint 不会抱怨;

测试

import Measure from '../src/testing'

describe('Measure Class', () => {
  const measure = new Measure(1, 'm')

  // Number() - works!
  test('Number', () => {
    const number = Number(measure)
    expect(number).toBe(1)
  })

  // String - works!
  test('String', () => {
    const string = String(measure)
    expect(string).toBe('1m')
  })

  /**
   * Number context - fails!
   * Operator '+' cannot be applied to types '1' and 'Measure'.ts(2365)
   */
  test('Number + Measure', () => {
    const number = 1 + measure
    expect(number).toBe(2)
  })

  /**
   * String context - fails!
   * Expected: "is: 1m"
   * Received: "is: 1"
   */
  test('String + Measure', () => {
    const string = 'is: ' + measure
    expect(string).toBe('is: 1m')
  })
})
Run Code Online (Sandbox Code Playgroud)