Dan*_*ebb 6 types typescript koa
我正在使用这个库https://github.com/chentsulin/koa-bearer-token,它为像这样的koa库请求对象添加了额外的属性ctx.request.token。因此,如果我直接使用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};
}
Run Code Online (Sandbox Code Playgroud)
然后我在其他文件中使用它,例如:
import {ContextWithToken} from 'koa-bearer-token';
const someFunction = (ctx: ContextWithToken) => {
const token = ctx.request.token; // <-- No longer errors
};
Run Code Online (Sandbox Code Playgroud)
现在可以使用,但是我担心这不是最好的方法,因为如果将来我需要添加更多属性,它将无法使用,理想情况下,我只想创建一个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/**/*"
]
}
Run Code Online (Sandbox Code Playgroud)
您可以尝试使用模块扩充。您不必声明新模块。Typescript将要合并这两个模块,您应该拥有传统的koa类型以及您的新类型。
import * as koa from "koa"
declare module 'koa'{
interface Request {
token: string;
}
}
declare const c: koa.Request;
c.token = 'tre';
Run Code Online (Sandbox Code Playgroud)
棘手的是,必须在导入koa之后立即放置它。因此,我建议将此新更改设置在单独的文件中,以便轻松将更改应用于所有地方。
import * as koa from "koa";
import '<path to>koachanges';
Run Code Online (Sandbox Code Playgroud)
希望能有所帮助
关于你所说的,我会说有可能。
更改您的tsconfig以便添加全局d.ts文件。
...
"typeRoots": ["./node_modules/@types", "./typings"]
...
Run Code Online (Sandbox Code Playgroud)
在项目的根目录下的此新的打字文件夹中添加index.d.ts文件,并将其放置在其中。
import * as Koa from 'koa';
declare module 'koa'{
interface Request {
token: string;
}
}
Run Code Online (Sandbox Code Playgroud)
重要的是添加第一个导入,然后再将koa类型导入到全局文件中,然后您可以覆盖它们。
| 归档时间: |
|
| 查看次数: |
2526 次 |
| 最近记录: |