使用新的定义文件向现有库中添加typescript类型



我正在使用这个库https://github.com/chentsulin/koa-bearer-token这为类似CCD_ 1的koa库请求对象添加了额外的属性。因此,如果我直接使用koa类型,我会得到一个错误,告诉token属性在ctx.request.token上不存在。

我当前的解决方案

我创建了一个名为koa-bearer-token.d.ts的类型定义文件,其中包含库的类型和扩展的koa上下文/请求类型的导出:

declare module 'koa-bearer-token' {
import {Context, Request, Middleware} from 'koa';
interface Options {
queryKey?: string;
bodyKey?: string;
headerKey?: string;
reqKey?: string;
}
interface RequestWithToken extends Request {
token?: string
}
interface ContextWithToken extends Context {
request: RequestWithToken
}
export default function bearerToken(options?: Options): Middleware;
export {RequestWithToken, ContextWithToken};
}

然后我在其他文件中使用这个,比如:

import {ContextWithToken} from 'koa-bearer-token';
const someFunction = (ctx: ContextWithToken) => {
const token = ctx.request.token; // <-- No longer errors
};

我为什么要问这个问题

这现在有效,但我担心这不是最好的方法,因为如果我将来需要添加更多属性,这将不起作用。理想情况下,我只想创建一个添加到库类型的koa.d.ts文件,然后我可以继续使用import {Context} from 'koa';而不是import {ContextWithToken} from 'koa-bearer-token';,但当我创建koa.d.ts时,它会覆盖所有库类型,而不是在它们之上添加。

这是我的tsconfig.json,以防它帮助

{
"compilerOptions": {
"module": "commonjs",
"esModuleInterop": true,
"target": "es6",
"noImplicitAny": true,
"moduleResolution": "node",
"sourceMap": true,
"outDir": "dist",
"baseUrl": ".",
"paths": {
"*": [
"node_modules/*",
"src/@types/*"
]
}
},
"include": [
"src/**/*"
]
}

您可以尝试模块扩充。您不必声明一个新模块。Typescript将合并这两个模块,您应该有遗留的koa打字员和新的打字员。

import * as koa from "koa"
declare module 'koa'{
interface Request {
token: string;
}
}
declare const c: koa.Request;
c.token = 'tre';

棘手的是,它必须放在考拉进口之后。因此,我建议将这个新的更改设置在一个单独的文件中,这样就可以很容易地在任何地方应用您的更改。

import * as koa from "koa";
import '<path to>koachanges';

希望能帮助

关于你所说的,我认为这是可能的。

更改tsconfig以添加全局d.ts文件。

...
"typeRoots": ["./node_modules/@types", "./typings"]
...

在项目根目录下的这个新打字员文件夹中添加一个index.d.ts文件并放置在其中。

import * as Koa from 'koa';
declare module 'koa'{
interface Request {
token: string;
}
}

重要的是添加第一个导入,然后将koa打字员导入全局文件,然后可以覆盖它们。

将类型添加到koa-bearer-token.d.ts的另一个更具扩展性的解决方案是添加一个类似ctx.request.token0的文件,并在其中添加任何额外的属性,如

import {Context, Request} from 'koa';
declare namespace KoaExtensions {
interface KoaRequest extends Request {
token?: string
}
interface KoaContext extends Context {
request: KoaRequest
}
}
export = KoaExtensions;

然后可以导入扩展类型:

import {KoaContext} from './@types/koa-extensions';
const someFunction = (ctx: KoaContext) => {
const token = ctx.request.token; // <-- No longer errors
};

这是对我的初始解决方案的改进,但看起来我仍然能够在本地koa.d.ts文件中全局地扩展Koa模块类型。

我需要做同样的事情来向Knockout添加一些东西。我创建了一个my-ko-additions.d.ts文件,并以与Knockout声明相同的方式实现它:

interface KnockoutStatic {
additionalFunc1(input: string): string;
additionalFunc2(input: string): string;
}
declare var ko: KnockoutStatic;
declare module "knockout" {
export = ko;
}

然后我只需要说ko.additionaFunc1('abc')就可以实现和使用这些功能。

最新更新