- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在实现一个 call
函数,该函数接收对象和属性名称,然后在传递的属性处调用驻留在传递的对象中的函数。
function call<
T,
K extends {
[K in keyof T]: T[K] extends Function ? K : never
}[keyof T],
>(t: T, func: K) {
t[func]();
}
看起来 ts 对此很满意并正确地过滤了属性(没有 prop
,只有 do
可用):
但它还在我调用函数的行上显示错误:t[func]();
:
Cannot invoke an expression whose type lacks a call signature.
Type '{}' has no compatible call signatures.
我找到了类似的 issue [Type deduction using mapped types and generics]然而它作为另一个 issue [Call signatures of union types] 的副本被关闭.显然问题是第二个泛型参数实际上是所有满足条件的属性名称的联合类型。
除了转换为 any
之外,还有其他方法可以解决这个问题吗?
附言:Playground
最佳答案
Typescript 无法计算出您对属性的过滤意味着 T[K]
始终是一个函数。您可以稍微反转您的约束,以指定 T
扩展具有 ()=>void
function call<
T extends { [P in K]: ()=> void },
K extends keyof T
>(t: T, func: K) {
t[func]();
}
class Test {
prop: string = "";
doStuff(): void {}
}
call(new Test(), "prop") // error
call(new Test(), "doStuff") // ok
不过请注意,您可能会考虑在原始函数中使用断言,上面的版本在避免断言和类型安全的同时并不能帮助智能感知确定可以为第二个参数分配哪些可能的值,所以不要这样:
虽然在这种情况下通常应该避免断言,但我们确信类型实际上是正确的,因为我们对键有约束,所以这个版本也应该没问题:
function call2<
T,
K extends {
[K in keyof T]: T[K] extends ()=> void ? K : never
}[keyof T],
>(t: T, func: K) {
(t[func] as any as ()=> void)();
}
关于 typescript 。过滤功能属性和 `Cannot invoke an expression whose type lacks a call signature.`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50075560/
我有以下功能: tempFunc :: Int-> Int-> Int tempFunc x y | y == 0 = 0 | x `mod` y == 0 = y + tempFun
当我将 pgAdmin III 连接到 Herkou 上的 PostgreSQL 时,它说:“服务器缺少检测功能......” 如何在 Heroku 上安装这些功能 - 在一个像黑盒子一样的服务器上?
好吧,我真的被困在这个问题上了。 我有 dirs.txt 如下: /var/tmp/old files.txt /var/tmp/old backups.bak dirs.txt文件由脚本自己生成。
我的 Web 应用程序有问题:在我的管理 bean 中: private boolean isUserInDB() { List users = userFacade.findByLogin
我的 AppWidgetProvider(当然是 BroadcastReceiver)已注册接收 CONNECTIVITY_CHANGE,以便我可以尽快更新小部件网络已恢复(尽管仅在需要时,即如果由于
我的页面只包含以下 HTML 代码: Back Test Test 当我尝试 validate it 时为什么会收到
我创建了一段代码: intToDigit :: Char -> Int ord :: Char -> Int intToDigit c = ord c - ord 'a' 但是,当我运行它时,我收到以
我正在尝试实现查看屏幕截图。当我运行我的代码时,我遇到了一些错误并且捕获失败。 这是我的代码: func saveSelfAsImage() { self.lockFocus() le
我在评论Why should I always enable compiler warnings?并指出 In the embedded world, the warnings that worry
我正在编写一个类来保存图的连接组件的状态,支持动态连接,并且每次删除或添加新边时,我都必须重新计算相邻组件以连接或拆分它们。 这些方法唯一可以抛出的异常是 std::bad_alloc .我的任何依赖
我有以下接口(interface)和类型(所有这些都可以更改) interface Base { type: string; } interface A extends Base {
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 8 年前。 Improve
我正在使用 as3httpclientlib 将数据发布到我的网络服务,但我一直获得以下安全违规。有谁知道如何解决这个问题?我的 crossdomain.xml 文件位于安全违规通知下方。 注意:我正
我有一个带有一些返回Task的函数的接口(interface)。一些实现该接口(interface)的类没有任何等待的内容,而其他类可能只是抛出异常 - 因此这些警告是虚假且烦人的。 是否可以抑制这些
我从 sccanf() 收到这个警告: ../../../../ext/oedipus/oedipus.c:211: warning: conversion lacks type at end of
我正在使用 jest 对 firestore 执行集成测试。我期望收到包含等于 field1 和 field2 的字段的文档。但是,我收到了以下错误。 我尝试在 firecase 控制台中创建复合索引
我从 sccanf() 收到这个警告: ../../../../ext/oedipus/oedipus.c:211: warning: conversion lacks type at end of
SonarQube 有一个规则,允许您验证每个文件是否有版权和/或许可证。但是,我不确定如何使用可变年份指定版权。 例如,这是他们的合规解决方案: /* * SonarQube, open sour
我有一个单元测试来检查 null 参数。测试方法是这样的: [TestMethod] public async Task Test_NullParam() { Mock mockAuth =
首先:我可能只是犯了一个愚蠢的错误。 我正在将我的一个旧项目从 Spring XML 转换为 Javaconfig。该数据库是内存中的 HSQLDB 数据库。不幸的是,它给了我这个错误: org.hi
我是一名优秀的程序员,十分优秀!