gpt4 book ai didi

Typescript 接口(interface)合并使返回类型更具体

转载 作者:行者123 更新时间:2023-12-05 04:08:07 25 4
gpt4 key购买 nike

我想使用自定义类型定义来使 Express API 中的返回类型更加具体。我们使用 app.setapp.get 将全局对象保存在我们的应用程序中。

app.get('foo') 返回一个特定的类 MyClass,所以我想使用 TypeScript 表达这个事实以避免必须显式转换.

包含的 index.d.tsapp.get 的现有定义如下所示:

get: ((name: string) => any) & IRouterMatcher<this>;

在我的自定义类型定义中,我添加了以下内容:

import { MyClass } from '../MyClass';

declare global {
namespace Express {
export interface Application {
get (name: 'foo'): MyClass;
// also tried this to conform to existing structure:
// get: ((name: 'foo') => MyClass);
}
}
}

但在这两种情况下,app.get('foo') 的返回类型仍然是any

在执行以下操作时是否可以隐式拥有正确的类型……:

let myObject = app.get('foo');

... 并避免必须写:

let myObject: MyClass = app.get('foo');

最佳答案

那么,使用当前版本的 express.js type definitions我发现您可以使用此代码增强 get 功能。

custom.d.ts:

import { MyClass } from './MyClass';

declare module 'express-serve-static-core' {
export interface IRouterMatcher<T> {
(name: 'foo'): MyClass;
}
}

解释:

不幸的是,这是一个有点老套的解决方案,因为你使用了 declaration merging对于看似无关的界面。您需要这样做,因为您不能像 this 中那样使用全局 Express 命名空间扩充回答:

declare namespace Express {  
export interface Application {
get(name: 'foo'): MyClass; //doesn't work :(
}
}

因为如果你仔细观察打字,你会看到 get Express.Application 中的和 set 方法被使用 extends 覆盖关键字。

export interface Application extends IRouter, Express.Application {
...
set(setting: string, val: any): Application;
get: ((name: string) => any) & IRouterMatcher<this>;
...
}

您也不能增加 getset 方法,因为如果更改属性类型,声明合并将不起作用。

declare module 'express-serve-static-core' {
export interface Application {
get: ((name: string) => any) &
IRouterMatcher<this> &
((name: 'foo') => MyClass);
//Error: 'Error: Subsequent variable declarations must have the same type. :(
}
}

我认为更简洁的解决方案是更改 DefinitelyTyped typing .它的工作方式类似于在 previously 中完成 Request 对象扩充的方式。提到的问题(get 签名需要表示为可以与自定义类型合并的接口(interface))

关于Typescript 接口(interface)合并使返回类型更具体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47988713/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com