- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个这样的函数接口(interface):
interface Callback {
(a: string, b: number): void;
}
而且我可以在不声明参数类型的情况下实现它,如下所示:
const callback: Callback = (a, b) => { }
在这种情况下,TypeScript 理解 callback
的参数类型实际上是 (a: string, b: number)
。
但是,如果我用一个键入的参数声明它,例如 b: number
:
const callback: Callback = (a, b: number) => { }
另一个参数a
的类型变为any
。 Example in the Playground .奇怪的是编译器确实知道 a
应该是什么类型,因为它不会让你错误地定义它,例如 (a: boolean, b: number)
会说参数不兼容。为什么它不推断a
的参数类型?
上面是一个简单的例子,但在尝试生成类型安全的 Redux reducer map 时让我有些头疼。 :
interface IReducer<TState> {
(state: TState, action: IAction): TState;
}
interface IReducerMap<TState> {
[actionType: string]: IReducer<TState>;
}
interface MyState { hello: string; }
interface MyAction extends IAction { say: string; }
const myReducerMap: IReducerMap<MyState> = {
// Result: `(state: MyState, action: IAction) => MyState`
// But I get an error on `action.say` not defined in `IAction`
reducer1: (state, action) => {
return { hello: action.say };
},
// Result: `(state: any, action: MyAction) => computed`
reducer2: (state, action: MyAction) => {
return { hello: action.say + state.this_should_be_an_error };
},
// Works but relies on you to correctly defining state
reducer3: (state: MyState, action: MyAction) => {
return { hello: action.say };
}
}
由于每个函数将采用 IAction
的子类型作为其 action
参数(在本例中为 MyAction
),我必须在中声明其类型回调参数。但是一旦我声明了它的类型,我就失去了 state
的类型,我必须声明它。当我有几十个回调并且每个回调都有一个像 DataImportMappingState
这样的真实状态名称时,这很烦人。
最佳答案
a
和b
的推断来自上下文打字。以前,只有在所有 参数都没有注释的情况下,参数才会根据上下文进行类型化。
This behavior has changed in the latest build of the TypeScript compiler因为它似乎不直观。现在上下文类型将应用于所有没有显式类型注释的参数。
关于如果声明参数类型,TypeScript 函数实现会将参数类型降级为 `any`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40350610/
是否可以将 Azure 云服务实例从“小型”虚拟机降级为“超小型”虚拟机? 到目前为止我尝试过的:- 将 Visual Studio 中的 VM 更改为“超小”- 构建了一个新包- 上传到门户网站-
几天前我更新了 Jenkins 。但是在当前的 Jenkins 版本中,存在一些烦人的 bug。是否可以降级 Jenkins 的版本,如果可以,怎么可能? 最佳答案 最近我也一直在努力降级 Jenki
我已经安装了 Android SDK 4.0.3,我想安装一个先行版本(例如 2.2),所以我应该卸载 4.0.3 版本吗? 怎么做? 最佳答案 只需在 Android SDK 管理器中安装所需的 S
最近我更新了我的 android 游戏,编辑 sqlite 数据库在我的表中添加新字段,更新后,我收到 4 个崩溃报告(其中 3 个来自同一设备,Samsung Galaxy S4) android.
思考:当活动服务出现性能问题以后,我们只能眼睁睁看着活动服务被压垮吗? 1、添加@HystrixCommand后,Hystrix是如何实现超时和降级功能? 1、 在某个方法上添加了@Hystrix
将 Magento 商店从企业版 1.10.1.1 降级到社区版 1.7.0.0 应遵循什么程序? 我做的步骤是: 备份 Magento EE 1.10.1.1 数据库 :) 将此数据库导入到一个名为
一个问题,因为我可以卸载并安装旧版本的 map 服务器,因为我导致大致以下错误,我认为是相同的版本 警告:[MapServer 错误]:msLoadSymbolSet():第一个标记必须是 SYMBO
如何降级我的 flutter 版本以避免空安全?我更新了,这个功能出现了,但我使用了一些包,比如徽章和 https,这些包没有更新为空安全,我得到了几个错误来运行我的代码。 我的pubspec: 环境
我已经为 Mysql 和 DBI 安装了 Perl 模块,但是由于我在当前版本中遇到的错误,我想将它们降级到旧版本。是否可以使用 cpan 将它们降级为旧版本?我该怎么做? 最佳答案 要强制安装特定版
我有一些关于 azure sql 升级/降级的问题。我发现的唯一信息是,要升级/降级,您必须导出 .bacpac 并将其导入到新的升级/降级服务器上。 当更新版本的 azure sql 可用时,Mic
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 5 年前。 Improve th
我是 Android 开发的新手,我想我可能犯了一个错误。我一直在我的 build.gradle 文件中使用 compileSdkVersion 25。但我希望我的应用程序支持 Android 4.1
我使用它,它在 webkit 浏览器上运行良好,在 firefox 上运行简单。但是 Opera 给出了奇怪的结果。 我正在使用的 CSS: color:@coreDarkBlue; backgrou
我需要打开一个文件,对其进行读取锁定,然后尝试获取写入锁定,但如果失败则保留读取锁定。 这在使用 fcntl 锁定的 POSIX 中效果很好。 在 Windows 中,我可以使用 LockFileEx
我已经安装了 Xamarin(Xamarin studio、Xamarin.Android)但是即使是最简单的项目构建也存在一些问题(只需创建新项目->构建->出现错误)。 经过一些谷歌搜索后,我发现
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 8年前关闭。 Improve this q
我在尝试使用 Pyinstaller 时遇到错误。在做了一些研究之后,我认为该错误是由最新版本的 setuptools (19.3) 中的错误引起的。该修复程序似乎正在降级到 setuptools 版
我正在尝试使用 Angular 升级机制将我们的 ng1 项目升级到 ng2。实际上,我重写了一个组件,它提供了多个内容( Angular 为 1.5 的多重包含/插槽)。 我的问题是,它可以在一个组
我在 Ubuntu 服务器上本地托管 Gitlab。 在没有检查 Ubuntu 18.04 版本是否支持 Gitlab 的情况下,我刚刚安装了它。 现在我注意到我无法将我的 Gitlab 安装更新到最
假设 iOS 自动续订订阅提供对包含存储分配的服务的访问。有多个订阅级别,其允许的存储量各不相同。订阅者可能希望随着存储需求的变化而升级或降级其订阅。 StoreKit 文档向我展示了如何开始订阅,但
我是一名优秀的程序员,十分优秀!