我正在使用具有以下(精简)类型定义的软件包ko-component-router ...

索引

export { IContext, Context } from './context';
export { Router } from './router';

上下文
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 {
  // ...
}

路由器
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;
}

在消费者方面,注册了中间件,该中间件可以向传递到 View 组件的上下文中添加属性,例如...
import { Router } from 'ko-component-router'


Router.use((ctx) => ({
    beforeRender() {
        ctx.someProperty = 'foo'
    }
}))

不出所料,编译器会抛出Property 'someProperty' does not exist on type 'IContext'错误。

根据declaration merging的文档,我尝试添加以下内容,以使编译器知道此新属性...
import { Router } from 'ko-component-router'

declare module 'ko-component-router' {
    interface IContext {
        someProperty: string
    }
}

Router.use((ctx) => ({
    beforeRender() {
        ctx.someProperty = 'foo'
    }
}))

但是会引发相同的错误。我已经尝试了几乎所有我能想到的东西,但是如果不完全在我的项目中完全重新实现类型定义,就无法使编译器意识到这个新属性。

这可能吗?如果可以,我会误入歧途吗?

最佳答案

如Cartant的评论中所述,模块增强不适用于“间接”导出的类和接口(interface)-this is a known issue

如果您扩展定义了IContext的内部模块,它将起作用:

declare module 'ko-component-router/context' {
    export interface IContext {
        someProperty: string
    }
}

不幸的是,任何以这种方式添加扩充功能的人都会对库的内部结构产生依赖性。

同样,有了这个扩充,class Context不再编译了:



因此,如果将属性添加到由某些类实现的接口(interface),则这些属性必须是可选的:
declare module 'ko-component-router/context' {
    export interface IContext {
        someProperty?: string
    }
}

关于typescript - 增强导入 typescript 界面,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46918373/

10-09 09:09