【问题标题】:Passing types as values in typescript在打字稿中将类型作为值传递
【发布时间】:2018-10-06 13:35:27
【问题描述】:

我想将接口作为值传递给配置对象:

export interface RouterConfig {
  startEvents?: typeof RouterEvent[];
  completeEvents?: typeof RouterEvent[];
}

用法应该是这样的:

private config: RouterConfig = {
  startEvents: [NavigationStart],
  completeEvents: [NavigationEnd, NavigationCancel, NavigationError]
};

但是它抛出了一个错误:

属性“completeEvents”的类型不兼容。类型 '(typeof NavigationEnd | typeof NavigationCancel | typeof NavigationError)[]' 不可分配给类型 'RouterEvent[]'。键入'typeof NavigationEnd |导航类型取消 | typeof NavigationError' 不可分配给类型 'RouterEvent'。类型“typeof NavigationEnd”不可分配给类型“RouterEvent”。 “typeof NavigationEnd”类型中缺少属性“id”。

我该如何解决?

这是stackblitz reproduction

注意RouterEvent是一个类

【问题讨论】:

  • 我没有将问题标记为重复,不用担心。不过,我相信根本原因是相同的 - typeof 子类并不总是与其父类的 typeof 兼容。

标签: angular typescript


【解决方案1】:

所有NavigationEndNavigationCancelNavigationError 的类都有带参数的构造函数。 RouterEvent 类型有一个没有参数的构造函数。这就是分配失败的原因。如果你想接受一个带有任意数量参数的构造函数,你需要使用一个能反映这一点的构造函数签名,例如这将起作用 new (...args: any[]) => RouterEvent Angular 已经以 Type 类型的形式为这个构造函数定义了一个类型别名.所以我们可以这样写:

import { Component, Type } from '@angular/core';
import { RouterEvent, NavigationStart, NavigationEnd, NavigationCancel, NavigationError } from '@angular/router';

export interface RouterConfig {
  startEvents?: Type<RouterEvent>[];
  completeEvents?: Type<RouterEvent>[];
}
let config: RouterConfig = {
  startEvents: [NavigationStart],
  completeEvents: [NavigationEnd, NavigationCancel, NavigationError]
};

【讨论】:

    猜你喜欢
    • 2020-06-22
    • 1970-01-01
    • 2021-06-17
    • 2017-06-09
    • 2019-09-25
    • 2019-02-10
    • 2021-06-17
    • 2023-03-30
    • 1970-01-01
    相关资源
    最近更新 更多