javascript - 为什么这段代码不会产生打字稿错误?
问题描述
给定以下示例:
type Bar = {
foo: (x: number, y: number) => number;
};
const Test = (): Bar => {
const foo = (): number => {
return 1;
};
return {
foo,
};
};
这个片段通过了打字稿编译,我不明白为什么。
Test 是一个返回 Bar 的函数。
Bar 是一个对象,它必须有一个带有指定参数和返回类型的函数 foo。
我在这里期待一个打字稿错误....
Play with it in typescript playground: https://www.typescriptlang.org/play?ts=4.0.2#code/C4TwDgpgBAQghgJygXigbwFBW1AZge3wC4oAKADxIDsBXAWwCMIEAaKEa+phAShQD4otRswDcGAL7iAxvioBnYFAAqERSjI8S8JMkGYcUWQqUF8G0lqFdmA9FkM4EEYDQRUoARnGGpD7M6u7vaOOGYs-lB+UkA
解决方案
请参阅https://www.typescriptlang.org/docs/handbook/functions.html#optional-and-default-parameters(强调我的):
可选参数和默认参数
在 TypeScript 中,假定每个参数都是函数所必需的。这并不意味着它不能被赋予 null 或 undefined,而是当函数被调用时,编译器会检查用户是否为每个参数提供了一个值。编译器还假定这些参数是唯一将传递给函数的参数。简而言之,给函数的参数数量必须与函数期望的参数数量相匹配。
所以,在你的代码之后,这有效
console.log(Test())
但这会产生编译错误
console.log(Test().foo())
推荐阅读
- httprequest - wemos d1 mini 上的 micropython http 请求
- sqlite - SQLITE 声明 - 日期
- java - 使用 App Engine 和 Maven 生成 pom.xml 文件
- r - 为什么特征函数返回“要替换的项目数不是替换长度的倍数”?
- c++ - 使用源向量作为目标
- javascript - Node.js 存储要在多个模块之间使用的变量的最佳方式
- javascript - 无法读取未定义的属性“0” - 日期
- elixir - 在 Elixir 地图中 => 和 : 有什么区别?
- node.js - 使用 axios 处理我的 JSON 数据时遇到问题
- python - Python:从 .seg 文件中提取数据