- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 typescirpt 进行基于原型(prototype)的编程,发现 typescript 对此的支持有限。所以我想知道使用typescript是否基本上放弃了基于原型(prototype)的编程范式?
这是我的演示代码:
const Foo = {
init (name: string) {
this.name = name
return this
},
getName(): string {
return this.name
}
}
const Bar = {
init (name: string, label: string) {
Foo.init.call(this, name)
this.label = label
return this
},
getLabel() {
return this.label
}
}
Object.setPrototypeOf(Bar, Foo)
const bar = <typeof Bar> Object.create(Bar)
bar.init('lisiur', 'javascript')
bar.getName()
在最后一行 typescript 提示 类型 '{ init(name: string, label: string): any; 上不存在属性 'getName' getLabel():任意; }'.ts(2339)
。有办法解决吗?
更新:
在lib.d.ts中,Object.create
和Object.setPrototypeOf
都缺少必要的类型声明(它们都返回any)。那么有没有办法声明我自己的 create
和 setPrototypeOf
来实现这一点?
最佳答案
可以使用原型(prototype)范例创建对象,但 TypeScript 无法推断它们的类型。仍然可以使用打字,但必须手动提供。一个例子:
interface FooBaseType {
getName(): string
}
interface FooType extends FooBaseType {
init(name: string): void
}
interface BarType extends FooBaseType {
init(name: string, label: string): void
getLabel(): string
}
const Foo = { /* … */ }
const Bar = { /* … */ }
Object.setPrototypeOf(Bar, Foo)
const bar = Object.create(Bar) as BarType // manually affects 'BarType'
bar.init('lisiur', 'javascript')
bar.getName()
...或者相同的示例,使用来自 Foo
和 Bar
的推断:
const Foo = { /* … */ }
const Bar = { /* … */ }
Object.setPrototypeOf(Bar, Foo)
// Remove the following line with TypeScript 3.5
type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>
type FooBaseType = Omit<typeof Foo, "init">
type FooType = FooBaseType & Pick<typeof Foo, "init">
type BarType = FooBaseType & typeof Bar
const bar = Object.create(Bar) as BarType // manually affects 'BarType'
bar.init('lisiur', 'javascript')
bar.getName()
关于javascript - 使用 typescript 是否基本上放弃了基于原型(prototype)的编程范式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56318867/
这是我的预期输出 我试图在不裁剪图像的情况下获得输出,这是我的代码 .blog-col-group { display: flex; } .blog-col {} .mod-vin-img {
这是我的预期输出 我试图在不裁剪图像的情况下获得输出,这是我的代码 .blog-col-group { display: flex; } .blog-col {} .mod-vin-img {
我正在编写一个 C++ 程序,该程序采用包含 double 的真实输入信号的 FFT。值并返回一个 vector X包含 std::complex值。获得结果 vector 后,我会尝试计算结果的幅度
A B C D 1 3 3 3 3 3 结果很明显,自然加入后 A B C D 1 3 3 3 3 3 3 3 这是为什么?我认为自然连接要求在这两种情况下具有相似的属性?第一张表连C、D属
对于我的网站,我通过 jquery 将所有子页面加载到一个 div 中,该 div 基本上涵盖了除菜单之外的所有内容。结构是这样的,你按下帐户按钮,你会得到登录表单,然后有一个链接(触发一个 oncl
我从 GPUImage 中的边缘检测滤镜得到了一张黑白图像,其中白色代表边缘,图像内容大部分是黑色的,不透明的。问题是,我想将此图像叠加在另一个图像之上,以显示边缘如何与下面的图像对齐。 但是非边缘区
好的,我的数据库类有一个数据库项目。我有一个用 MySQL 制作的数据库,正在用 C# 制作我的应用程序。该数据库基本上只是一个部件数据库,在 4NF 中由部件、关系表、构建、客户和订单表组成,因为这
我在 scipy 中使用 griddata 函数来插入 3 维和 4 维数据。它像冠军一样工作,除了它返回一堆 NaN,因为我需要的一些点超出了输入数据的范围。考虑到 N-d 数据无论如何仅适用于“线
我正在 Linux (Ubuntu) 上编写一个 C++ 程序。我想删除一个目录的内容。它可以是松散的文件或子目录。 本质上,我想做一些等同于的事情 rm -rf /* 您能否建议在 C++ 中执行此
我使用node.js加密文件并在JAVA中解密。解密是使用“AES/GCM/Nopadding”算法在 JAVA 中完成的,它是第三方应用程序,因此我无法更改 JAVA 代码。我使用“aes-256-
我是一名优秀的程序员,十分优秀!