gpt4 book ai didi

typescript - 在 typescript 中继承静态方法

转载 作者:搜寻专家 更新时间:2023-10-30 20:53:10 27 4
gpt4 key购买 nike

我正在生成使用继承的 TypeScript 类。每个类都使用一个静态创建函数,该函数可能不同。

class A {
static create(arg: string): A {
// use args to create A
return new A()
};
}

class B extends A {
static create(argsForB: number): B {
// use argsForB to create B
return new B()
};
}

既然无论如何都不应该继承静态函数,这个错误没有任何意义:

Class static side 'typeof B' incorrectly extends base class static side 'typeof A'.
Types of property 'create' are incompatible.
Type '(argsForB: number) => B' is not assignable to type '(arg: string) => A'.
Types of parameters 'argsForB' and 'arg' are incompatible.
Type 'string' is not assignable to type 'number'.

我知道一种解决方案是简单地将创建函数重命名为 createA 和 createB,但感觉不对。

最佳答案

请记住,Typescript 主要是最近 ECMAscript 规则的超集。一般来说,Javascript 没有类型,因此 Typescript 会阻止您创建它认为 Javascript 无法辨别您要调用哪个版本的类。它不能强制执行一个版本或另一个版本,因为从 TS 的角度来看,两者生成的代码是相同的。另请注意,这与静态方法无关。如果删除静态限定符,您将在第二个类的创建方法中收到一条错误消息,并显示类似的消息。

看看 Playground 上生成的 typescript ,你就会明白它的含义:Typescript Playground example

我仍然不太明白你在这种情况下的目标是什么,但这样做会解决这个问题,尽管可能无法解决你想要完成的事情:

class A {
static create(arg: string | number): A {
// use args to create A
return new A()
};
}

class B extends A {
static create(argsForB: string | number): B {
// use argsForB to create B
return new B()
};
}

有许多在 Javascript 中工作良好的构造,Typescript 将它们称为错误,因为它们的工作方式不允许强制执行类型规则。

考虑以下几点:

class A {
content: string;
static create(arg: string): A {
// use args to create A
let result = new A();
result.content = arg;
return new A()
};
}

class B extends A {
content: number;
static create(argsForB: number): B {
// use argsForB to create B
let result = new B();
result.content = argsForB;
return result;
};
sendMessage
}

let testB = B.create(5);
alert(testB.content);
let testCastA = testB as A;
alert(testCastA.content);

和以前一样,生成的 Javascript 使这项工作有效,但它没有达到我的预期。

关于typescript - 在 typescript 中继承静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46619882/

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