Typescript 泛型中对接口成员的约束

2023-11-25

我有一个方法,应该接受任何对象,只要它的所有字段都是字符串或数字

我做了这个,它非常适合鸭子打字

static interpolateParams(
    route: string, 
    params: {[key: string] : string | number}) : string {

    const parts = route
        .split("/")
        .map(part => {
            const match = part.match(/:([a-zA-Z09]*)\??/);
            if (match) {
                if (!params[match[1]]) {
                    console.error("route argument was not provided", route, match[1]);
                    return part;
                }

                return params[match[1]];
            }
            else {
                return part;
            }
        })

    return "/" + parts.slice(1).join("/");
}

and call

interpolateParams("/api/:method/:value", {method: "abc", value: 10});

现在我想做interpolateParams接受任何路由接口params.

interpolateParams<IABCParams>("/api/:method/:value", {method: "abc", value: 10});

问题是它仍然应该匹配所有字符串或数字字段的约束

有没有办法将给定接口的所有字段指定为某种类型的通用约束?

我试过了

static interpolateParams<T extends {[key: string] : string | number}>(
    route: string, 
    params: T) : string {

显然得到了这个

类型 'IABCParams' 不满足约束 '{ [key: string]: string |数字; }'。

“IABCParams”类型中缺少索引签名。

Thanks


T的约束可以参考T(有一些限制),因此您可以使用映射类型来生成具有相同字段的约束T:

function interpolateParams<T extends {[P in keyof T] : string | number}>(
    route: string, 
    params: T) : string { /*...*/ }

请注意,循环类型参数约束的欺骗有时会导致问题,尽管这种情况可能没问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Typescript 泛型中对接口成员的约束 的相关文章

随机推荐

  • WPF:即使显式设置 WindowState,窗口仍保持最小化

    我的应用程序有一个托盘图标 双击该图标可隐藏或显示应用程序窗口 我的问题是 如果窗口隐藏时处于最小化状态 我似乎无法将窗口带到前台 例如 假设用户最小化应用程序 然后双击托盘图标 然后应用程序窗口将隐藏并从任务栏中消失 当用户再次双击托盘图
  • GenyMotion 虚拟设备打开并立即消失

    我下载了带有虚拟 VM 包的 GenyMotion Android 模拟器 一切都很顺利 直到虚拟设备下载过程为止 虚拟设备已成功下载 但当我尝试通过点击播放按钮运行虚拟设备时 会弹出一个小窗口 显示正在初始化虚拟设备 然后启动虚拟设备 几
  • 如何仅在触发特定活动后启动 FCM ID 服务?

    假设我有一个LoginActivity用户可以在其中使用现有凭据注册或登录 我不想要FirebaseInstanceIdService生成令牌 除非用户已登录并且MainActivity应用程序的启动 谢谢 你无法阻止FirebaseIns
  • Mockito 间谍 - 调用内部类方法而不是监视间谍对象中的方法时

    我的内部类如下 public class ClassWithInnerObject private final InnerObject innerObject public ClassWithInnerObject innerObject
  • 获取shell中程序的执行时间

    我想在几个不同的条件下在linux shell 中执行某些操作 并且能够输出每次执行的执行时间 我知道我可以编写一个 perl 或 python 脚本来执行此操作 但是有没有办法在 shell 中执行此操作 恰好是 bash 使用内置的ti
  • 标准库容器和不完整类型的规则是什么?

    给定一个不完整的类型 struct S 那么以下声明是 S p ok pointer to incomplete types is allowed std deque
  • 将 Word 转换为 HTML,然后在网页上呈现 HTML

    我的项目正在进行中 但我不知道从哪里开始 我的老板希望能够以 HTML 格式显示 Word 文档 并且它看起来与 Word 文档相同 在一次又一次尝试让我在弹出窗口或灯箱中显示 Word 文档后 他一直坚持剥离 Word 的内容 将其转换为
  • 如何在boost log 2.0中记录编码器的行数?

    我可以为此使用 LineID 属性吗 我希望我可以使用 sink set formatter 来执行此操作而不是使用 LINE and FILE 在每个日志语句中 我为此苦苦挣扎 直到我发现这个片段 define LFC1 LOG TRAC
  • Swiftui [BUG] 导航视图和列表仅在 iPad 模拟器上不显示

    各种iPad模拟器上的空白页 前往Apple开发者网站下载以下教程项目 https developer apple com tutorials swiftui building lists and navigation 在任何 iPad 模
  • 在支持应用程序的模式下在 Mobile Safari 中使用 mailto: 链接时出错

    我在网页中有一个表单 其操作为 mailto email 其中电子邮件是真实的电子邮件地址 当我在 Mobile Safari 中以常规模式加载此页面时 即 不是在支持应用程序的模式下从主屏幕启动 效果很好 在我提交表单后 电子邮件应用程序
  • ASP.Net MVC 6 中的全局错误日志记录

    我正在测试 MVC 6 Web Api 并希望实现登录到全局错误处理程序 只是保证没有错误会在没有被记录的情况下离开系统 我创建了一个 ExceptionFilterAttribute 并将其全局添加到启动中 public class Ap
  • Angular2 http 重试逻辑

    我有一个带有基于令牌的身份验证机制的 API 成功登录后 我在浏览器的本地存储中存储两个令牌 访问令牌和刷新令牌 访问令牌包含在服务器端授权用户所需的所有必要信息 并且具有到期日期 当访问令牌过期时 客户端可以使用刷新令牌请求新的访问令牌
  • 如何使用新线程库中的 Task.Wait For Any?

    尝试使用Delphi中的线程库并行计算任务并使用TTask WaitForAny 为了得到第一个计算结果 偶尔会出现异常停止执行 异常时的调用堆栈 第一次机会例外 价格为 752D2F71 美元 异常类 EMonitorLockExcept
  • TextView 中的整数值

    如何在 TextView 中显示整数值 当我尝试时 出现错误android content res Resources NotFoundException String resource ID TextView tv new TextVie
  • 如何在Java 8中逐行读取文件?

    在Java 8中 我看到Files类中添加了名为lines 的新方法 该方法可用于在Java中逐行读取文件 它适用于大文件吗 我的意思是我们可以加载前 1000 行 然后加载第二组 1000 行吗 我有 1GB 的大文件 可以吗 有人可以分
  • 狮身人面像和“你的意思是……?”建议想法。它会起作用吗?

    我正在尝试想出最快的方法来提出搜索建议 起初我认为 Levenstein UDF 函数与 mysql 表相结合就可以完成这项工作 但是使用 levenshtein mysql 必须遍历表中的每一行 大量的单词 这会使查询非常慢 现在我最近安
  • 如何用等角透视进行渲染? [复制]

    这个问题在这里已经有答案了 可能的重复 使用opengl进行真正的等角投影 我想使用 Blender3d 使用的相同等距渲染进行渲染 我该怎么做 是否可以仅调用 glMultMatrix 我尝试谷歌搜索 但找不到任何可以导致这种渲染模式的工
  • Kotlin 中默认构造函数中的两个附加类型?

    自从我一直在使用kotlin 反射为了调用我的默认值和声明的构造函数 我看到了第二个不同的构造函数 我意识到两个不同的领域int arg3 and kotlin jvm internal DefaultConstructorMarker a
  • Visual Studio 2015 中的 TFS 生成资源管理器在哪里?

    我在 Windows 8 上运行 Visual Studio Enterprise 2015 RTM 在 Visual Studio 2013 中 构建资源管理器位于团队资源管理器 gt 构建 gt 操作 gt 管理队列中 Visual S
  • Typescript 泛型中对接口成员的约束

    我有一个方法 应该接受任何对象 只要它的所有字段都是字符串或数字 我做了这个 它非常适合鸭子打字 static interpolateParams route string params key string string number s