gpt4 book ai didi

TypeScript 3.9.5- 交集 '...' 减少到 'never',因为属性 'usage' 在某些成分中具有冲突类型

转载 作者:行者123 更新时间:2023-12-04 09:40:54 24 4
gpt4 key购买 nike

我有一个函数,它接受一个类定义并使用它来返回一个新的抽象类。直到 TS v3.8.3 这工作正常。现在,在升级到 TS v3.9.5 时,Typescript 似乎从传递给函数的类中获得了不同的类型。最好是在这里重现代码。

enum AttributeUsageModel {
ContractHash = 0x00,
ECDH02 = 0x02,
ECDH03 = 0x03,
Script = 0x20,
Vote = 0x30,
DescriptionUrl = 0x81,
Description = 0x90,
Hash1 = 0xa1,
Hash2 = 0xa2,
Hash3 = 0xa3,
Hash4 = 0xa4,
Hash5 = 0xa5,
}

type BufferAttributeUsageModel =
| 0x81
| 0x90
| 0xf0
| 0xfa
| 0xfb
| 0xfc
| 0xfd
| 0xfe
| 0xff;

type Constructor<T> = new (...args: any[]) => T;

abstract class AttributeBaseModel<T extends AttributeUsageModel> {
public abstract readonly usage: T;
}

class AttributeModel extends AttributeBaseModel<BufferAttributeUsageModel> {
public readonly usage: BufferAttributeUsageModel;

public constructor(usage: BufferAttributeUsageModel) {
super();
this.usage = usage;
}
}

function AttributeBase<
Usage extends AttributeUsageModel,
TBase extends Constructor<AttributeBaseModel<Usage>>
>(Base: TBase) {
// Replacing `Base` with `AttributeModel` apparently fixes it
abstract class AttributeBaseClass extends Base {} // Base constructor return type is apparently 'never'

return AttributeBaseClass;
}

// Base constructor return type 'never' is not an object type or intersection of object types with
// statically known members.
// The intersection 'AttributeBase<AttributeUsageModel, typeof
// AttributeModel>.AttributeBaseClass & AttributeModel' was
// reduced to 'never' because property 'usage' has conflicting types in some constituents.
class BufferAttribute extends AttributeBase(AttributeModel) {
public constructor(usage: BufferAttributeUsageModel) {
super(usage);
}
}

来自 Typescript 的错误在 AttributeBase(AttributeModel) 上突出显示.在这个例子中 AttributeModel正在作为 Base 传递到函数中争论。如果我们使用 AttributeModel直接在函数内部而不是 Base争论错误消失了。但这是一回事,对吧?

我还不是 Typescript 的专家,但我们确实需要一些方法来使用这个 AttributeBase函数或其他一些方法来动态扩展多个基类。或许答案是显而易见的,但这似乎是相当奇怪的行为。我已经尝试了很多其他的东西,但没有任何东西能保持我们从这个设置中得到的相同类型的严格性。

所以有人可以向我解释这里发生了什么以及我如何解决这个问题,以便我们在没有 never 的情况下获得相同的类型安全性。来自 AttributeBase(AttributeModel) 的返回类型?

我也将此代码发布到了一个仓库 here如果这有帮助。

最佳答案

问题是您的 BufferAttributeUsageModel不延长 AttributeUsageModel .

您的 AttributeBaseModel<T extends AttributeUsageModel>需要 T extends AttributeUsageModel ,然后你定义 class AttributeModel extends AttributeBaseModel<BufferAttributeUsageModel>BufferAttributeUsageModel不扩展 AttributeUsageModel .这就是您的 usage属性(property)“在某些成分中具有冲突的类型”。 - 如错误所述。

为了解决这个问题,你可以定义 BufferAttributeUsageModel作为:

type BufferAttributeUsageModel =
AttributeUsageModel
| 0x81
| 0x90
| 0xf0
| 0xfa
| 0xfb
| 0xfc
| 0xfd
| 0xfe
| 0xff;

也许,您应该尝试简化这些类型定义。

关于TypeScript 3.9.5- 交集 '...' 减少到 'never',因为属性 'usage' 在某些成分中具有冲突类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62337849/

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