我正在生成使用继承的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()
};
}
Run Code Online (Sandbox Code Playgroud)
由于静态函数无论如何都不应该继承,因此这个错误没有任何意义:
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'.
Run Code Online (Sandbox Code Playgroud)
我知道一个解决方案是简单地将create-funtion重命名为createA和createB,但感觉不对.
请记住,Typescript 主要是最新 ECMAscript 规则的超集。一般来说,Javascript 没有类型,因此 Typescript 会阻止您创建一个它认为 Javascript 无法识别您要调用哪个版本的类。它无法强制执行一个版本或另一个版本,因为从 TS 角度来看,两个版本生成的代码是相同的。另请注意,这与静态方法无关。如果删除静态限定符,您将在第二个类的 create 方法上收到错误,并显示类似的消息。
看看 Playground 上生成的 Typescript,你就会明白它的含义:Typescript Playground 示例
我仍然不太明白你在这种情况下想要做什么,但是做这样的事情将消除问题,尽管可能无法解决你想要完成的事情:
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()
};
}
Run Code Online (Sandbox Code Playgroud)
有许多结构在 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);
Run Code Online (Sandbox Code Playgroud)
和以前一样,生成的 Javascript 可以使这项工作正常进行,但它并没有达到我的预期。
| 归档时间: |
|
| 查看次数: |
771 次 |
| 最近记录: |