我正在使用一个包 — ko-component-router — 具有以下(精简的)类型定义...
索引.d.ts
export { IContext, Context } from './context';
export { Router } from './router';
Run Code Online (Sandbox Code Playgroud)
上下文.d.ts
export interface IContext {
$root: IContext;
$child: IContext;
$children: IContext[];
$parent: IContext;
$parents: IContext[];
router: Router;
route: Route;
params: {
[k: string]: any;
};
path: string;
pathname: string;
base: string;
canonicalPath: string;
}
export declare class Context implements IContext {
// ...
}
Run Code Online (Sandbox Code Playgroud)
路由器.d.ts
import { IContext } from './context';
export declare type Middleware = (ctx: IContext, done?: () => any) => {
beforeRender?: (done?: () => void) => Promise<any> | void;
afterRender?: (done?: () => void) => Promise<any> | void;
beforeDispose?: (done?: () => void) => Promise<any> | void;
afterDispose?: (done?: () => void) => Promise<any> | void;
};
export declare class Router {
static use(...fns: Middleware[]): void;
}
Run Code Online (Sandbox Code Playgroud)
在消费者方面,注册了中间件,可以将属性添加到传递给视图组件的上下文中,因此......
import { Router } from 'ko-component-router'
Router.use((ctx) => ({
beforeRender() {
ctx.someProperty = 'foo'
}
}))
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,Property 'someProperty' does not exist on type 'IContext'编译器抛出了一个错误。
根据关于声明合并的文档,我尝试添加以下内容以使编译器知道这个新属性......
import { Router } from 'ko-component-router'
declare module 'ko-component-router' {
interface IContext {
someProperty: string
}
}
Router.use((ctx) => ({
beforeRender() {
ctx.someProperty = 'foo'
}
}))
Run Code Online (Sandbox Code Playgroud)
但抛出同样的错误。我已经尝试了我能想到的所有方法,但是如果不完全重新实现我的项目中的类型定义,我就无法让编译器知道这个新属性,这显然远非理想。
这是可能的,如果是这样,我会误入歧途吗?
正如 cartant 的评论中提到的,模块扩充不适用于“间接”导出的类和接口 -这是一个已知问题。
如果您扩充定义的内部模块,它会起作用IContext:
declare module 'ko-component-router/context' {
export interface IContext {
someProperty: string
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,任何以这种方式添加增强功能的人都会引入对库内部结构的依赖。
此外,通过此增强class Context不再编译:
错误 TS2420:类“Context”错误地实现了接口“IContext”。“Context”类型中缺少属性“someProperty”。
因此,如果您向某些类实现的接口添加属性,这些属性必须是可选的:
declare module 'ko-component-router/context' {
export interface IContext {
someProperty?: string
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1740 次 |
| 最近记录: |