【问题标题】:Extending String between two stacked errors在两个堆叠错误之间扩展字符串
【发布时间】:2016-12-24 05:50:35
【问题描述】:
class Name extends String {
     constructor(){
          super(...arguments);
     }
    valid(){
         return /[a-zA-Z]/.test(this);
    }

}

使用 expect of jest ,我运行我的测试

const name=new Name('Ahmed'); // instruction does not throw exception 
it('something',()=>{
     expect(name.valid()).toEqual(true); //---calling valid make the ERROR
})

我收到以下错误:

String.prototype.toString is not generic

所以我做什么,我手动实现toStringvalueOf 方法。

class Name extends String {

    valid(){
         return /[a-zA-Z]/.test(this);
    }
    toString(){
         return this;
    }
    valueOf(){
         return this;
    }

}

我又跑了,我得到了:

: Cannot convert object to primitive value

【问题讨论】:

  • 我先运行了sn-p,它工作正常,没有错误。
  • 它可能是一个 pb 的单元测试框架 +jsx
  • 你的问题有babel标签,表示生成的代码是ES5。字符串在 ES5 中是不可子类化的。您的代码可以正常工作,即作为 ES6 代码。

标签: javascript unit-testing ecmascript-6 babeljs jestjs


【解决方案1】:

通过将toString & valueOf 实现为解决:

toString(){
  return Object.keys(this).map((k)=>this[k]).join('');
}
valueOf(){
  return Object.keys(this).map((k)=>this[k]).join('');
}

因为,当我在控制台中检查 new String('abc') 时,我注意到结果是 {0:'a',1:'b',2:'c'} 并且:

 Object.keys({0:'a',1:'b',2:'c'}`).map((k)=>str[k]).join('') === 'abc'

但是,我敢说为儿童班重新实现toString 很奇怪。

【讨论】:

  • 这会翻译成什么 ES5 代码?与使用具有单个字符串属性的类相比,这效率如何?我不明白你这样做的好处。
猜你喜欢
  • 1970-01-01
  • 2011-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 2012-01-10
相关资源
最近更新 更多