gpt4 book ai didi

javascript - 使用 typescript 是否基本上放弃了基于原型(prototype)的编程范式?

转载 作者:行者123 更新时间:2023-12-02 23:35:09 26 4
gpt4 key购买 nike

我正在尝试使用 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.createObject.setPrototypeOf都缺少必要的类型声明(它们都返回any)。那么有没有办法声明我自己的 createsetPrototypeOf 来实现这一点?

最佳答案

可以使用原型(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()

...或者相同的示例,使用来自 FooBar 的推断:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com