typescript中类型参数的问号(const t:类型T〈?>)

jvlzgdj9  于 2022-12-14  发布在  TypeScript
关注(0)|答案(1)|浏览(297)

我遇到了一个奇怪的Typescript错误,而返工模块注册代码在我的应用程序。

abstract class Component<P, S> {
    state?: Readonly<S>;
    props?: P;
}

interface IModuleProperties {
    name: string;
}

interface IModuleState {
    index: number;
}

export class ModuleBase<P extends IModuleProperties, S extends IModuleState> extends Component<P, S> {
}

export class Module1 extends ModuleBase<IModuleProperties, IModuleState> {
}

const t: typeof ModuleBase = Module1;
const t2: typeof ModuleBase<?,?> = Module1;

下面是本例的TS游戏场。
您可以看到变量t存在错误

Type 'typeof Module1' is not assignable to type 'typeof ModuleBase'.
  Construct signature return types 'Module1' and 'ModuleBase<P, S>' are incompatible.
    The types of 'state' are incompatible between these types.
      Type 'Readonly<IModuleState> | undefined' is not assignable to type 'Readonly<S> | undefined'.
        Type 'Readonly<IModuleState>' is not assignable to type 'Readonly<S>'.(2322)

这对我来说没有多大意义,因为类型参数是用Module1硬编码的。
偶然间我发现了用于变量t2的方法,我很惊讶它实际上是有效的(使用TS 4.9.3)。这让我想起了Java泛型,但是我在Typescript泛型文档中找不到关于这个特性的描述。
所以我想知道,这个特性是如何正式命名的(忽略类型参数?),在哪里可以找到它的文档?

更新

这不是这个问题的一部分,但由于这是从一个问题中产生的,我试图在这里解决正确的解决方案,以避免any或(即将删除的)?
const t2: typeof ModuleBase<IModuleProperties, IModuleState> = Module1;

a0x5cqrl

a0x5cqrl1#

在TypeScript中没有这样的特性。您遇到了一个bug,示例化表达式显然允许JSDoc类型提示,但它们不应该这样做;请参阅microsoft/TypeScript#51802。我今天提交了这个问题,TS团队已经合并了microsoft/TypeScript#51804来修复它。这意味着它将从下一个nightly build开始中断,最晚将随TypeScript 5.0发布,所以您不应该继续使用它。由于?显然在您的示例代码中被解释为any类型,您可以将?更改为any以使其保持相同的工作方式。
这就是问题的答案,有可能您的底层用例使用any以外的东西会得到更好的解决,但这超出了这个问题的范围。

相关问题