typescript - 如何使用 Typescript 的声明与从模块导入的接口(interface)合并?

标签 typescript generics

https://www.typescriptlang.org/docs/handbook/declaration-merging.html

上面的链接提供了有关声明与接口(interface)合并的信息。我希望能够使用具有通用组件的接口(interface)来做到这一点。我目前正在使用 Typescript 3.0.3。

这就是我想要的,但我不明白为什么我不能对声明合并做同样的事情。

interface MyRouteComponentProps<P, C extends StaticContext = StaticContext> extends RouteComponentProps<P, C> {
    loadCandidateFromQueryParam: (candidateId: number) => void
}

class CandidateDetailContainer extends React.Component<MyRouteComponentProps<RouteMatchProps>, {}> {

    public componentWillMount() {
        this.props.loadCandidateFromQueryParam(Number(this.props.match.params.candidateId));
    }

为什么这不起作用?
interface RouteComponentProps<P, C extends StaticContext = StaticContext> {
    loadCandidateFromQueryParam: (candidateId: number) => void
}

class CandidateDetailContainer extends React.Component<RouteComponentProps<RouteMatchProps>, {}> {

它似乎完全覆盖了 RouteComponentProps 的整个定义,而不是合并它们。我得到与从未使用过的 P 和 C 相关的错误(如果合并了定义,那么我希望这些错误会消失,因为它们已在主要定义中使用)。然后我收到一个关于“匹配”字段不存在的错误。同样,原始定义中存在的另一个字段。

作为引用,这里是我试图合并的原始定义。
export interface RouteComponentProps<P, C extends StaticContext = StaticContext> {
  history: H.History;
  location: H.Location;
  match: match<P>;
  staticContext: C | undefined;
}

最佳答案

实际上,在您的第二个示例中,当我添加我认为您必须拥有的导入时:

import * as React from "react";
import { RouteComponentProps, StaticContext } from "react-router";

我在导入 RouteComponentProps 时遇到错误.

您不能通过声明同名的本地符号来将内容合并到导入的符号(接口(interface)、命名空间等)中;这将是一个错误,或者它会隐藏导入的符号。要合并定义,它们必须在同一范围内。在将内容合并到模块中的符号的情况下,您可以使用模块扩充将您的定义放在原始模块的范围内:
declare module "react-router" {
    interface RouteComponentProps<Params, C extends StaticContext = StaticContext> {
        loadCandidateFromQueryParam: (candidateId: number) => void
    }
}

(使它成为模块扩充而不是模块声明的原因在于它嵌套在另一个模块中。我知道这很晦涩。)请注意,类型参数的名称必须与原始接口(interface)中的名称相同。

关于typescript - 如何使用 Typescript 的声明与从模块导入的接口(interface)合并?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52637028/

相关文章:

css - 左 Angular 动画不起作用

c++ - 如何将 N 个通用参数传递给 typedef 函数指针?

Java 泛型 : wildcard and type parameter syntax when defining generic class

c# - 如何在 C# 中使泛型参数 T 可空?

typescript - 使用 TypeScript 的 Jest 测试无法识别导入别名

javascript - 用户单击后 Angular 更改复选框的状态

css - Angular 2 : Set CSS class from Observable

reactjs - react typescript 构造函数状态与属性

java - 使用 Java 泛型确保接收到的参数与类或其子类型相同

C# 泛型/接口(interface) - 根据类返回不同类型