如何解决打字稿4:原型方法的临时覆盖
下一个代码在打字稿3.3.3上运行(在repl.it上)。每次其他调用时,它都会覆盖或恢复为原型的方法。
class Foo {
foo () {
this.foo = function() {
console.log('instance call')
delete this.foo // ⟵ Compilation problem with TS4 here
}
console.log('prototype call')
}
}
const f = new Foo()
f.foo()
f.foo()
f.foo()
f.foo()
输出为:
prototype call
instance call
prototype call
instance call
但是此代码无法在打字稿4上编译。删除行会发出““'删除'”运算符的操作数必须是可选的。错误。
有什么方法可以解决特定的编译问题? 可能会有一些小的变化,因为我经常使用这种范例。
解决方法
TypeScript 4.0添加了you may only delete
properties that are optional的限制。由于foo
的{{1}}属性是必需的,因此不允许您Foo
使用它。从该实例中删除某个实例(该实例也存在于该原型中)的用例大概没有被考虑,或者被认为不够重要。
通常可以解决此问题的一种方法是使delete
方法为可选,如下所示:
foo
但这可能不是,因为您知道class Foo {
foo?() {
this.foo = function () {
console.log('instance call')
delete this.foo
}
console.log('prototype call')
}
}
const f = new Foo()
if (f.foo) f.foo()
if (f.foo) f.foo()
if (f.foo) f.foo()
if (f.foo) f.foo()
将始终存在于继承链中。
相反,您只能在foo
语句中使用type assertion来告诉编译器将delete
视为其this
属性是可选的:
foo
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。