TypeScript 一种表示方法必须被重写的方式

sf6xfgos  于 6个月前  发布在  TypeScript
关注(0)|答案(2)|浏览(80)

在JavaScript中,可以在MDN等文档中重写toStringvalueOf以自定义对象,因为从Object继承的版本并不是很有用(可怕的[object Object])。然而,据我所知,没有一种方式可以在类型中表达一个类必须重写这些方法(或者一个对象必须拥有它们作为自己的属性),因此无法知道它们是否可靠。

🔍 搜索词

方法重写,toString,自有属性

✅ 可实现性检查清单

我的建议满足以下准则:

  • 这不会对现有的TypeScript/JavaScript代码造成破坏性的改变
  • 这不会改变现有JavaScript代码的运行时行为
  • 这可以在不根据表达式的类型发出不同的JS的情况下实现
  • 这不是一个运行时特性(例如库功能、带有JavaScript输出的非ECMAScript语法、新的JS语法糖等)
  • 这个特性将与TypeScript's Design Goals的其他部分一致。

⭐ 建议

一个想法是有一个own修饰符,它基本上会比较一个属性名与由以下函数产生的列表:

const ownModifierList = (obj) => {
  const isObjectLiteral = obj.constructor.name === "Object";
  const toList = isObjectLiteral ? obj : obj.constructor.prototype;
  return Object.getOwnPropertyNames(toList).filter(x => x !== 'constructor')
}

我认为这样读起来很好:

type showable = {
   own toString: () => string
}

📃 激励性示例

拥有一个无用的toString几乎是Liskov替换违反,而JavaScript用户已经学会不依赖它。Typescript可以提供帮助。
修饰符也会使拒绝Object.create(null)变得容易。
我最近一直在阅读一些Haskell,我很羡慕类型类Show给haskeller们带来的信心,但它是内置的。JavaScript使用toString进行类型强制转换,我相信通过修复它来实现那种程度的信心是有意义的。
我不知道在什么其他情况下需要一个方法被重写,因为这会表明基类的方法不适合使用,这是一个红旗,但我的想象力不足并不能证明它在其他情况下不能派上用场。

💻 用例

有一种多态的方式来查询对象中的字符串。
目前,一个人需要实现一个自定义方法或通过某种标签表示toString是安全使用的,用户需要知道这个标签/自定义方法。
我们可以想象像排序函数这样的通用函数,默认将对象转换为字符串以处理它,但只有在它是一个可用的字符串时才这样做。IDE可以通过函数定义的工具提示广告表示,只要实现了toString就可以传递一个对象,这将让用户高兴,因为它可能会在许多地方清理一些代码。

njthzxwz

njthzxwz2#

这个eslint no-base-to-string规则解决了一个独特的关注点,即以用户为中心的问题:"我是否可以接受在我的整个项目中全局看到[Object object]"。
如果某个特定函数只接受具有自己的toStringvalueOf属性的对象,因为它依赖于这些属性(例如排序),那么这是一个实现者关注的问题,而未能向该函数提供这样的对象并不是用户偏好的问题,而是一个类型错误。
不得不在全球范围内选择性地启用一个仅适用于一个函数的类型错误,会让用户面临他们将被迫在其他所有地方处理的误报。
这也给实现者提供了一个保证,即该函数将被正确使用,因为用户可能没有启用此规则。

相关问题