javascript - TypeScript 将类型保存为未定义

标签 javascript node.js typescript

class A {
    private static readonly letters: { [type: string]: any; } = { 'b' : B }

    public static check(): void {
        console.log(A.letters)
        let letters: { [type: string]: any; } = { 'b' : B }
        console.log(letters)
    }
}

class B extends A {

}

A.check()

结果:

{ b: undefined }
{ b: { [Function: B] check: [Function], letters: { b: undefined } } }

为什么第一个日志是未定义的?

最佳答案

正如@E.Sundin 在他的评论中所写,当类 A 被求值时,类 B 不存在。

你需要有一个静态初始化器:

class A {
    private static readonly letters: { [type: string]: any; }

    public static init() {
        (this as any).letters = { 'b' : B }
    }

    ...
}

...

A.init()
A.check()

( code in playground )

因为您希望 A.letterreadonly,所以需要将 this 转换为 any 否则编译器提示分配给只读属性。


另一种选择是分配一个空对象,然后再填充它:

class A {
    public static readonly letters: { [type: string]: any; } = {};

    ...
}

class B extends A { }
A.letters["b"] = B;

但是 A.letters 需要公开,您可以将它移到 A 之外以使其“隐藏”:

const letters: { [type: string]: any; } = {};

class A { ... }
A.letters["a"] = A;

class B extends A { }
letters["b"] = B;

关于javascript - TypeScript 将类型保存为未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42180557/

相关文章:

typescript - 使用对象文字的键作为 Typescript 类型?

javascript - ReactJS 将对象复制到新的状态变量或在树中传递状态

jquery getJSON 没有响应,但直接访问有响应

node.js - 使用 TypeScript 正确扩展stream.Transform类

javascript - mongoose、express 和 node.js 中回调函数的参数

javascript - 按一定顺序分隔数组中的字符串

javascript - 如何在nestjs中使用自定义类文件维护nestjs规则

java - 在Java中调用JavaScript函数

javascript - 从 html select 执行 Javascript 函数

javascript - 为什么 oninput 事件在 Angular 中的行为与在 JavaScript 中的行为不同?