https://www.typescriptlang.org/docs/handbook/declaration-merging.html
以上链接提供有关声明与接口合并的信息。我希望能够通过具有通用组件的接口来做到这一点。我目前正在使用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;
}
答案 0 :(得分:2)
实际上,在您的第二个示例中,当我添加我认为您必须具有的导入文件时:
import * as React from "react";
import { RouteComponentProps, StaticContext } from "react-router";
导入RouteComponentProps
时出错。
您不能通过声明同名的本地符号来将内容合并到导入的符号(接口,名称空间等)中;这将是一个错误,或者将阴影化导入的符号。要合并定义,它们必须在同一范围内。在将内容合并到模块的符号中的情况下,可以使用模块扩充将定义放在原始模块的范围内:
declare module "react-router" {
interface RouteComponentProps<Params, C extends StaticContext = StaticContext> {
loadCandidateFromQueryParam: (candidateId: number) => void
}
}
(使它成为模块增强而不是模块声明的原因是它嵌套在另一个模块中。我知道这很晦涩。)请注意,类型参数的名称必须与原始接口中的名称相同。 / p>