TYPESCRIPT:'typeof X' 类型的参数不能分配给具有扩展的 'Y' 类型的参数
TYPESCRIPT : Argument of type 'typeof X' is not assignable to parameter of type 'Y' with extends
我开始使用打字稿编写代码,但遇到了一些编译问题。
我有好几个class,我好像有层级问题
在我的第一个 class (A) 中,我指出了一组属性/函数。我有第二个 class (B),它继承自 class (A),并添加了某些属性/功能。最后我有第三个 class (C) 继承自第二个
class (乙).
export default class A {
prop1: string;
function1() {
console.log('TEST');
}
}
export default class B extends A {
prop2: string;
function2() {
console.log('TEST');
}
}
export default class C extends B {
prop3: string;
function3() {
console.log('TEST');
}
}
编译时,我收到以下错误消息:
TS2345: Argument of type 'typeof C' is not assignable to parameter of
type 'A'. Type 'typeof C' is missing the following properties from
type 'B': prop1, function1.
我的 3 classes 在 3 个单独的文件中,我使用导出/导入,它似乎工作...
你有什么想法吗?
TS配置:
{
"compilerOptions": {
"outDir": "./dist/",
"noImplicitAny": true,
"module": "es6",
"target": "es5",
"jsx": "react",
"allowJs": true
}
}
我正在尝试编写这样的代码 link。网站上的错误消息与我在编辑器中的错误消息不太一样,但也许在网站上更正时我会发现最后的问题...
非常感谢。
感谢 playground link,它帮助找到了问题。
没有成功,因为你想存储一个工厂,要求一个实例。
主要技巧在这里:
registeredTypes: Map<string,typeof ComponentBase>
完整的固定版本在这里:
export class ComponentBase {
prop: string;
constructor(prop: string) {
this.prop = prop;
}
}
export class Component extends ComponentBase {
otherProp: string;
constructor(prop: string, otherProp: string) {
super(prop);
this.otherProp = otherProp;
}
}
export class ButtonGeneric extends Component {
buttonProp: string;
constructor(buttonProp: string) {
super('prop', 'otherProp');
this.buttonProp = buttonProp;
}
}
export class ButtonSpecific extends ButtonGeneric {
buttonSpecProp: string;
constructor(buttonSpecProp: string) {
super('buttonProp')
this.buttonSpecProp = buttonSpecProp;
}
}
export class ComponentFactory {
registeredTypes: Map<string,typeof ComponentBase>
constructor() {
this.registeredTypes = new Map<string,typeof ComponentBase>();
}
register(className: string, classConstructor: typeof ComponentBase) {
if (!this.registeredTypes.has(className)) {
this.registeredTypes.set(className, classConstructor);
}
}
create(className: string, properties: string) {
if (!this.registeredTypes.has(className)) {
throw Error('The class [' + className + '] doesn\'t exists. Couldn\'t create new object');
}
let classConstructor = this.registeredTypes.get(className);
if (classConstructor == null) { throw new Error('') }
const instance = new classConstructor(properties);
return instance;
}
}
const FactoryButtonConst = 'button';
export class ButtonFactory extends ComponentFactory {
constructor() {
super();
this.register(FactoryButtonConst, ButtonSpecific);
}
createButtonSpecific(buttonSpecProp: string) {
return this.create(FactoryButtonConst, buttonSpecProp);
}
}
我开始使用打字稿编写代码,但遇到了一些编译问题。
我有好几个class,我好像有层级问题
在我的第一个 class (A) 中,我指出了一组属性/函数。我有第二个 class (B),它继承自 class (A),并添加了某些属性/功能。最后我有第三个 class (C) 继承自第二个 class (乙).
export default class A {
prop1: string;
function1() {
console.log('TEST');
}
}
export default class B extends A {
prop2: string;
function2() {
console.log('TEST');
}
}
export default class C extends B {
prop3: string;
function3() {
console.log('TEST');
}
}
编译时,我收到以下错误消息:
TS2345: Argument of type 'typeof C' is not assignable to parameter of type 'A'. Type 'typeof C' is missing the following properties from type 'B': prop1, function1.
我的 3 classes 在 3 个单独的文件中,我使用导出/导入,它似乎工作...
你有什么想法吗?
TS配置:
{
"compilerOptions": {
"outDir": "./dist/",
"noImplicitAny": true,
"module": "es6",
"target": "es5",
"jsx": "react",
"allowJs": true
}
}
我正在尝试编写这样的代码 link。网站上的错误消息与我在编辑器中的错误消息不太一样,但也许在网站上更正时我会发现最后的问题...
非常感谢。
感谢 playground link,它帮助找到了问题。
没有成功,因为你想存储一个工厂,要求一个实例。
主要技巧在这里:
registeredTypes: Map<string,typeof ComponentBase>
完整的固定版本在这里:
export class ComponentBase {
prop: string;
constructor(prop: string) {
this.prop = prop;
}
}
export class Component extends ComponentBase {
otherProp: string;
constructor(prop: string, otherProp: string) {
super(prop);
this.otherProp = otherProp;
}
}
export class ButtonGeneric extends Component {
buttonProp: string;
constructor(buttonProp: string) {
super('prop', 'otherProp');
this.buttonProp = buttonProp;
}
}
export class ButtonSpecific extends ButtonGeneric {
buttonSpecProp: string;
constructor(buttonSpecProp: string) {
super('buttonProp')
this.buttonSpecProp = buttonSpecProp;
}
}
export class ComponentFactory {
registeredTypes: Map<string,typeof ComponentBase>
constructor() {
this.registeredTypes = new Map<string,typeof ComponentBase>();
}
register(className: string, classConstructor: typeof ComponentBase) {
if (!this.registeredTypes.has(className)) {
this.registeredTypes.set(className, classConstructor);
}
}
create(className: string, properties: string) {
if (!this.registeredTypes.has(className)) {
throw Error('The class [' + className + '] doesn\'t exists. Couldn\'t create new object');
}
let classConstructor = this.registeredTypes.get(className);
if (classConstructor == null) { throw new Error('') }
const instance = new classConstructor(properties);
return instance;
}
}
const FactoryButtonConst = 'button';
export class ButtonFactory extends ComponentFactory {
constructor() {
super();
this.register(FactoryButtonConst, ButtonSpecific);
}
createButtonSpecific(buttonSpecProp: string) {
return this.create(FactoryButtonConst, buttonSpecProp);
}
}