gpt4 book ai didi

typescript - Multi-mixin helper 会导致意外的不可分配的编译器错误。我做错了吗?

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

我正在尝试输入一个多混合辅助函数,它接受一个构造函数映射并返回那些扩展了一些新接口(interface)的构造函数的映射。

考虑以下人为设计的基类:

class Alpha { alpha: string = 'alpha'; };
class Beta { beta: string = 'beta'; };

我有一个 mixin 辅助函数,它接受这些类的映射并返回它们的可选扩展版本。没有打字,它看起来像这样:

// The multi-mixin helper function:
const Fooable = ({ Alpha, Beta }) => {
const AlphaWithFoo = class extends Alpha {
foo = 'foo';
};

return { Alpha: AlphaWithFoo, Beta };
}

// When invoked, it might be used like this:
const { Alpha: FooAlpha, Beta: FooBeta } = Fooable({ Alpha, Beta });
const fooAlpha = new FooAlpha();

// fooAlpha has both "alpha" and "foo" propoerties:
console.log(fooAlpha.alpha, fooAlpha.foo);

但是,当我完全键入此辅助函数时,我的键入会导致一个非常奇怪的不可分配的编译器错误。这是 TypeScript 编译器 Playground 的链接,您可以在其中查看我正在使用的类型以及相关的错误:

live example in typescriptlang.org playground

我读到的错误:

Type '<A extends Alpha, B extends Beta>({ Alpha, Beta }: Domain<A, B>) => { Alpha: typeof AlphaWithFoo;...' is not assignable to type 'DomainExtender<Foo, {}>'.
Type '{ Alpha: typeof AlphaWithFoo; Beta: Constructor<B>; }' is not assignable to type 'ExtendedDomain<A, B, Foo, {}>'.
Types of property 'Alpha' are incompatible.
Type 'typeof AlphaWithFoo' is not assignable to type 'Constructor<A & Foo>'.
Type 'AlphaWithFoo' is not assignable to type 'A & Foo'.

这个错误对我来说似乎有点奇怪。就好像编译器正在丢失 Alpha 类或其他东西的类型信息。但是,更有可能是我在某个地方犯了错误。

谁能帮我找出我哪里出错了?

最佳答案

从通用参数派生的方式有一个怪癖,通用参数必须扩展new(...args: any[]) => any(参数必须是...args: 任何[]).我们可以在这个 PR 中看到这一点。 .为了解决这个问题,我们可以在 Fooable 函数中使用辅助函数:

const Fooable: DomainExtender<Foo, {}> = ({ Alpha, Beta }) => {
function mixin<U extends Constructor>(Base: U) {
return class extends Base {
constructor(...args: any[]) {
super(...args);
}
foo: string = 'foo';
}
}
const AlphaWithFoo = mixin(Alpha);

return { Alpha: AlphaWithFoo, Beta };
}

关于typescript - Multi-mixin helper 会导致意外的不可分配的编译器错误。我做错了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48846830/

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