javascript 到打字稿:将基于原型的对象与基于 class 的对象混合
javascript to typescript: mix prototype based object with class based one
我正在尝试将 javascript 原型与基于 class 的原型混合,如下所示:
function Cat(name) {
this.name = name;
}
Cat.prototype.purr = function(){
console.log(`${this.name} purr`);
}
Cat.prototype.meow = function(){
console.log(`${this.name} meow`);
}
class Tiger extends Cat {
constructor(name) {
super(name);
}
meow() {
console.log(`${this.name} roar`);
}
}
上面的JS代码有效。
然后我将代码转换为打字稿,如下所示:
function Cat(this : any, name : string) {
this.name = name;
}
Cat.prototype.purr = function(){
console.log(`${this.name} purr`);
}
Cat.prototype.meow = function(){
console.log(`${this.name} meow`);
}
// error: Type '(this: any, name: string) => void' is not a constructor function type.
class Tiger extends Cat {
constructor(name : string) {
super(name);
}
meow() {
console.log(`${this.name} roar`);
}
}
class Tiger 不接受 class Cat 作为它的基础 class。 (在 JS 中有效但在 TS 中无效)。
我无法将 Cat 更改为标准 class 语法,因为我需要将 .prototype 访问权限指向另一个 JS 库。
谁能修复上面的TS代码?也许添加一些 .d.ts 定义。
注意:添加 // @ts-ignore 可以,但我不能这样做,因为 VS-code 智能感知将不起作用。
好吧,你可以尝试做这样的事情
interface CatClass {
name: string
purr(): void
meow(): void
new (name: string): CatClass
}
const Cat = function(this: CatClass, name: string) {
this.name = name
} as unknown as CatClass
// Then add functions to prototype and everything should be fine
问题是你为什么要这样做,为什么不把它重写成正常的class?似乎没有任何关于如何在没有这个 as unknown as CatClass
的情况下键入这样的函数 classes 的信息(这看起来有点 hack 但很好),也许是因为从来没有人需要这样做,我明白了。无论如何,在编译之后所有 classes 都变成了函数
我正在尝试将 javascript 原型与基于 class 的原型混合,如下所示:
function Cat(name) {
this.name = name;
}
Cat.prototype.purr = function(){
console.log(`${this.name} purr`);
}
Cat.prototype.meow = function(){
console.log(`${this.name} meow`);
}
class Tiger extends Cat {
constructor(name) {
super(name);
}
meow() {
console.log(`${this.name} roar`);
}
}
上面的JS代码有效。 然后我将代码转换为打字稿,如下所示:
function Cat(this : any, name : string) {
this.name = name;
}
Cat.prototype.purr = function(){
console.log(`${this.name} purr`);
}
Cat.prototype.meow = function(){
console.log(`${this.name} meow`);
}
// error: Type '(this: any, name: string) => void' is not a constructor function type.
class Tiger extends Cat {
constructor(name : string) {
super(name);
}
meow() {
console.log(`${this.name} roar`);
}
}
class Tiger 不接受 class Cat 作为它的基础 class。 (在 JS 中有效但在 TS 中无效)。 我无法将 Cat 更改为标准 class 语法,因为我需要将 .prototype 访问权限指向另一个 JS 库。
谁能修复上面的TS代码?也许添加一些 .d.ts 定义。
注意:添加 // @ts-ignore 可以,但我不能这样做,因为 VS-code 智能感知将不起作用。
好吧,你可以尝试做这样的事情
interface CatClass {
name: string
purr(): void
meow(): void
new (name: string): CatClass
}
const Cat = function(this: CatClass, name: string) {
this.name = name
} as unknown as CatClass
// Then add functions to prototype and everything should be fine
问题是你为什么要这样做,为什么不把它重写成正常的class?似乎没有任何关于如何在没有这个 as unknown as CatClass
的情况下键入这样的函数 classes 的信息(这看起来有点 hack 但很好),也许是因为从来没有人需要这样做,我明白了。无论如何,在编译之后所有 classes 都变成了函数