导入的类静态字段未定义

时间:2019-07-30 14:44:29

标签: angular typescript

我正在尝试找出静态字段与方法行为之间的区别,该类型与打字稿和angular中的类有关。帮助将非常有必要:)

我在app src中导出了带有静态字段和方法的类, 当我导入它并尝试使用静态字段时,如果我调用静态方法,它们将是未定义的。

src / app / core / colors.ts

   export class SystemColors {

    static  _gray: {
        default: '#ABAFBE',
        darker: ['#7C8298', '#606473'],
        lighter: ['#C8D1DA', '#E2E3ED', '#F5F6FA']
    };


    public static get gray() {
        return {
            default: '#ABAFBE',
            darker: ['#7C8298', '#606473'],
            lighter: ['#C8D1DA', '#E2E3ED', '#F5F6FA']
        };
    }
}

src / app / app.component.ts

import {SystemColors} from '...';

@Component({
    selector: 'app-root',
    templateUrl: './app.component.html',
    styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnInit, AfterViewInit {

    constructor() {}

    ngOnInit() {
        console.log(1, SystemColors.gray); // static get method has value
        console.log(2, SystemColors._gray); // static field undefined :(
    }
}

3 个答案:

答案 0 :(得分:0)

您可以看到here Typescript如何翻译您的代码。 特别是它对静态字段不起作用

相反,如果您让打字稿通过here的分配来推断类型,那么使用=代替:将会满足您的期望

答案 1 :(得分:0)

存在语法问题。在类中使用return [RCTLinkingManager application:application openURL:url options:options]为属性分配值。

尝试一下:

return [[FBSDKApplicationDelegate sharedInstance] application:application openURL:url sourceApplication:sourceApplication annotation:nil]

  

这是您推荐的Working Sample StackBlitz

答案 2 :(得分:0)

  static _gray: {
    default: '#ABAFBE',
    darker: ['#7C8298', '#606473'],
    lighter: ['#C8D1DA', '#E2E3ED', '#F5F6FA']
  };

这意味着“该类具有名为_gray的静态属性,其类型为[在此处插入对象]”。实际上,实际上没有给它赋值,只是一个类型。由于在编译时会删除类型信息,因此所有这些都将消失。相反,您想使用等号而不是冒号来做到这一点:

 static _gray = {
    default: '#ABAFBE',
    darker: ['#7C8298', '#606473'],
    lighter: ['#C8D1DA', '#E2E3ED', '#F5F6FA']
  };

使用此修改后的代码,您将为其分配一个实际的对象,而不仅仅是定义类型。将代码转换为javascript后,仍然会进行对象的创建和分配。