【问题标题】:How to reference parent's parameter in child function argument?如何在子函数参数中引用父参数?
【发布时间】:2020-11-27 05:39:01
【问题描述】:

Angular 6.0.7,我有一个父类wj-flex-grid-parent.class.ts。它有参数public m_wjcGridXlsx = wjcGrid.xlsx; 我可以使用this.m_wjcGridXlsx 成功地从我的子组件中引用这个参数。

子组件中的一个函数在尝试在其参数中引用 m_wjcGridXlsx 时仍然给我带来问题:

public _exportFormatItem(args: m_wjcGridXlsx.XlsxFormatItemEventArgs) {
...
}

this.m_wjcGridXlsx 被 intellisense 高亮显示找不到命名空间“m_wjcGridXlsx”。如何在arg 中引用m_wjcGridXlsx 参数?我试过预先附加 this.self. 无济于事。


父组件:

import { OnInit, ViewChild, AfterViewInit } from '@angular/core';
import * as wjcGridXlsx from 'wijmo/wijmo.grid.xlsx';
   
export class WjFlexGridParent implements OnInit
{    
    
    public m_wjcGridXlsx = wjcGridXlsx;    // the parameter giving me problems

...
}

子组件:

import { Component, OnInit, Input, Output, OnChanges, SimpleChanges, ViewChild, EventEmitter, HostListener } from '@angular/core';
import { WjFlexGridParent } from '../fw/wijmo/wj-flex-grid-parent.class';

@Component({
    selector: '...',
    templateUrl: '...',
    styleUrls: ['...']
  })

  export class ChildComponent extends WjFlexGridParent implements OnChanges, OnInit {

    randomFunction() {  
     // this works, m_wjcGridXlsx is recognized:
     this.m_wjcGridXlsx.FlexGridXlsxConverter.saveAsync(this.m_grid, { includeColumnHeaders: true, includeCellStyles: false, formatItem: null }, strFileName);
    }


    // this doesn't work, m_wjcGridXlsx is not recognized:
    public _exportFormatItem(args: m_wjcGridXlsx.XlsxFormatItemEventArgs) { 
       ...
    }

  }
    

【问题讨论】:

  • 你试过调试吗?

标签: javascript angular typescript parameters angular6


【解决方案1】:

在你的代码中

import {
  Component, OnInit, Input, Output, OnChanges, SimpleChanges, ViewChild,
  EventEmitter, HostListener
} from '@angular/core';
import { WjFlexGridParent } from '../fw/wijmo/wj-flex-grid-parent.class';

@Component({
    selector: '...',
    templateUrl: '...',
    styleUrls: ['...']
})
export class ChildComponent extends WjFlexGridParent implements OnChanges, OnInit {
  _exportFormatItem(args: m_wjcGridXlsx.XlsxFormatItemEventArgs) {}
}

您正在使用未声明的标识符m_wjcGridXlsx。范围内根本没有任何名称为m_wjcGridXlsx。您确实从WjFlexGridParent 继承了一个名为m_wjcGridXlsx 的属性,但是与任何属性一样,您必须符合条件,在这种情况下为thissuper

但是,如果我们写

_exportFormatItem(args: this.m_wjcGridXlsx.XlsxFormatItemEventArgs) {}

this.m_wjcGridXlsx 是在需要命名空间的地方使用的值。

简单且惯用的解决方案是导入类型并使用它。

import {XlsxFormatItemEventArgs} from 'wijmo/wijmo.grid.xlsx';

export class ChildComponent {
  _exportFormatItem(args: XlsxFormatItemEventArgs) {}
}

这与继承以及类和属性完全无关。它只是从模块中导入一个类型,因此我们可以使用它来注释一个值,在本例中为参数args

如果您愿意,可以使用模块命名空间导入并引用由您在导入语句中创建的命名空间别名限定的类型。

import * as wijmo from 'wijmo/wijmo.grid.xlsx';

export class ChildComponent {
  _exportFormatItem(args: wijmo.XlsxFormatItemEventArgs) {}
}

【讨论】:

    【解决方案2】:

    您正在尝试将父类实例上的值用作类型。 您要么需要将属性设为静态并使用 typeof 来获取类型,要么将类型本身导入到子类中。

    请注意,参数值可能是从父类传递的,但类型信息不需要通过父类来。

    【讨论】:

    • 确实如此,但typeof 不会恢复导入绑定的命名空间,因此无法使用它访问XlsxFormatItemEventArgs 类型。
    • 我明白了,但它不能通过查看父项来推断正确的类型吗?假设它是一个静态属性。当然,这比导入不太理想,因为它们无法引用实际类型,但从类型上讲,它应该是正确的,不是吗?
    • 给定一个模块,a.ts,包含export type T = {}; export const v = 1;,和一个模块,b.ts,包含import * as a from './a'; const a_ = a;. You can access the _type of_ the exported _value_ v` 通过typeof a_['v'],但不是type T。换句话说,在 b.ts 中,a 模块命名空间限定了 a.ts 导出的类型和值,但 a_ 只是值方面a.
    • 好的,所以这就是你最终得到一个像普通对象一样的东西作为 b 内部的类型,而不是类型 T(即使普通对象和 T 匹配相同的形状)?
    • 这与类型空间和值空间的区别有关。值名称存在于值空间中,值的所有成员本身就是值。类型名称存在于类型空间中,并且类型的所有成员本身就是类型。命名空间存在于这两个空间中。命名空间的成员可以是类型或值。命名空间由 namespace ns {}import * as ns 等结构创建。
    猜你喜欢
    • 2023-01-22
    • 1970-01-01
    • 2019-04-01
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 2020-03-14
    • 2020-02-27
    相关资源
    最近更新 更多