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