首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么在将函数参数传递给类型化函数时,TypeScript不能推断这些参数类型?

在将函数参数传递给类型化函数时,TypeScript不能推断这些参数类型的原因是因为函数参数的类型推断是基于函数的调用位置进行的,而不是基于函数的定义位置。在函数定义时,TypeScript会根据函数参数的声明来推断参数的类型,但是当我们将函数作为参数传递给另一个函数时,TypeScript无法确定传递给该函数的参数的具体类型。

这是因为在函数调用时,参数的类型可能是动态的,取决于调用函数时传递的实际参数。因此,TypeScript无法在函数定义时推断参数的类型,因为它无法预测函数的调用方式和传递的参数类型。

为了解决这个问题,我们可以使用泛型来指定函数参数的类型。通过使用泛型,我们可以在函数定义时指定参数的类型,并在函数调用时传递具体的类型参数。这样可以确保函数参数的类型正确推断。

以下是一个示例:

代码语言:txt
复制
function identity<T>(arg: T): T {
  return arg;
}

function logIdentity<T>(value: T): void {
  console.log(identity(value));
}

logIdentity(10); // 输出: 10
logIdentity("Hello"); // 输出: Hello

在上面的示例中,我们定义了一个泛型函数identity,它接受一个参数并返回相同的参数。然后,我们定义了另一个函数logIdentity,它接受一个参数并调用identity函数来输出参数的值。通过使用泛型,我们可以确保函数参数的类型正确推断,并在函数调用时传递具体的类型参数。

总结起来,TypeScript不能推断函数参数的类型是因为函数参数的类型推断是基于函数的调用位置进行的,而不是基于函数的定义位置。为了解决这个问题,我们可以使用泛型来指定函数参数的类型。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

TypeScript(6)函数「建议收藏」

TypeScript 能够根据返回语句自动推断出返回值类型。 书写完整函数类型 现在我们已经为函数指定了类型,下面让我们写出函数的完整类型。...这不是指不能传递 null 或 undefined 作为参数,而是说编译器检查用户是否为每个参数都传入了值。编译器还会假设只有这些参数会被传递进函数。...简短地说,传递给一个函数参数个数必须与函数期望的参数个数一致。 JavaScript 里,每个参数都是可选的,可传可不。 没传参的时候,它的值就是 undefined。...比如,我们想让 lastName 是可选的 TypeScript 里,我们也可以为参数提供一个默认值当用户没有传递这个参数或传递的值是 undefined 。...(x: string | number, y: string | number): string | number { // 实现上我们要注意严格判断两个参数类型是否相等,而不能简单的写一个

60930

TypeScript 演化史 — 第七章】映射类型和更好的字面量类型推断

这就是为什么当试图 42 赋值给 x 属性TypeScript 会出错。在运行时,分配要么抛出一个类型错误(严格模式),要么静默失败(非严格模式)。...对于希望应用程序中冻结的每种类型的对象,咱们就必须定义一个包装器函数,该函数接受该类型的对象并返回冻结类型的对象。没有映射类型,咱们就不能以通用的方式静态地使用 Object.freeze()。...更多映射类型的示例 上面已经看到 lib.d.ts 文件中内置的 Readonly 类型。此外,TypeScript 定义了其他映射类型这些映射类型各种情况下都非常有用。...} 只读类属性只能立即初始,也可以构造函数中初始。...常量的类型是 string 而不是 “GET”,则会出现编译错误,因为无法HTTP_GET 作为第二个参数递给get函数: Argument of type 'string' is not assignable

3.7K40

TypeScript 演化史 -- 7】映射类型和更好的字面量类型推断

这就是为什么当试图 42 赋值给 x 属性TypeScript 会出错。在运行时,分配要么抛出一个类型错误(严格模式),要么静默失败(非严格模式)。...对于希望应用程序中冻结的每种类型的对象,咱们就必须定义一个包装器函数,该函数接受该类型的对象并返回冻结类型的对象。没有映射类型,咱们就不能以通用的方式静态地使用 Object.freeze()。...此外,TypeScript 定义了其他映射类型这些映射类型各种情况下都非常有用。...} 只读类属性只能立即初始,也可以构造函数中初始。...常量的类型是 string 而不是 “GET”,则会出现编译错误,因为无法HTTP_GET 作为第二个参数递给get函数: Argument of type 'string' is not assignable

2.8K10

如何在 TypeScript 中使用函数

创建类型函数 本节中,我们将在 TypeScript 中创建函数,然后向它们添加类型信息。 JavaScript 中,可以通过多种方式声明函数。...本节中,我们学习如何创建函数类型,它们是表示特定函数签名的类型函数递给其他函数,创建与特定函数匹配的类型特别有用,例如,具有本身就是函数参数。这是创建接受回调的函数的常见模式。...使用类型异步函数 使用 JavaScript ,使用异步函数是比较常见的。TypeScript 有一种特定的方法来处理这个问题。本节中,我们将在 TypeScript 中创建异步函数。...现在,当我们鼠标悬停在这些函数,将为每个重载显示注释,如下面的动画所示: 用户定义的类型保护 本教程检查 TypeScript函数的最后一个特性是用户定义的类型保护,它们是允许 TypeScript...这些守卫条件代码块中强制执行某些类型,其中值的类型可能会根据情况而有所不同。这些使用 Array.prototype.filter 函数返回过滤的数据数组特别有用。

14.9K10

TypeScript 常用知识总结

TypeScript 通过类型注解提供编译的静态类型检查。 TypeScript 中的数据要求带有明确的类型,JavaScript不要求。 TypeScript函数提供了缺省参数值。...TypeScript 引入了命名空间 TypeScript 的优势 静态输入: 静态类型是一种功能,可以开发人员编写脚本检测错误。查找并修复错误是当今开发团队的迫切需求。...如果由于缺乏声明而不能推断类型,那么它的类型被视作默认的动态 any 类型。...剩余参数 有一种情况,我们不知道要向函数传入多少个参数,这时候我们就可以使用剩余参数来定义。 剩余参数语法允许我们一个不确定数量的参数作为一个数组传入。...元组中允许存储不同类型的元素,元组可以作为参数递给函数

1.8K30

3、你能读得懂的TypeScript教程之函数

函数同样是TypeScript的基础之一。通过函数你可以重合的功能代码块进行封装,然后在你需要它的时候调用即可。换句话说函数就是具有某一功能的代码块,它的使命是将你臃肿的代码变的更加苗条。...一、TypeScript中的函数是有类型函数类型分为参数类型与返回值类型。...JavaScript中,传递的参数是可选的,可传可不,当我们没有参的时候,它的值是undefined。...但是TypeScript中我们传递给一个函数参数个数必须与函数接收的参数个数一致,类型也需要一致。...TypeScript函数重载共用一个函数体,也就是说无论声明多少个同名的函数,它们共同使用同一个函数体,调用时会根据传递参数类型的不同,而执行这一个函数体。

72630

TypeScript 演化史 — 第八章】字面量类型扩展 和 无类型导入

扩展字面量类型 当使用 const 关键字声明局部变量并使用字面量值初始TypeScript 推断该变量的字面量类型: const stringLiteral = "https"; // Type...使用TypeScript 2.1,TypeScript 不是仅仅选择any类型,而是基于你后面的赋值来推断类型。 仅当设置了--noImplicitAny编译参数,才会启用此选项。...混合类的构造函数 (如果有) 必须有且仅有一个类型为any[]的变长参数, 并且必须使用展开运算符super(...args)调用中将这些参数传递。 定义完成之后,来研究一些代码。...这样做的原因是,mixin不应该绑定到具有已知构造函数参数的特定类;因此,mixin应该接受任意数量的任意值作为构造函数参数。所有参数都传递给Base的构造函数,然后mixin执行它的任务。...咱们的例子中,它初始 tag 属性。 混合构造函数类型指仅有单个构造函数签名,且该签名仅有一个类型为 any[] 的变长参数,返回值为对象类型.

4.5K10

TypeScript 3.4 正式发布!

下次使用 --incremental 调用 TypeScript ,它会用这些信息以最小的代价进行检测类型检查。...来自泛型函数的高阶类型推断 —— 调用返回函数类型的泛型函数类型参数推断期间,TypeScript 将会(视情况而定)从泛型函数参数类型参数递给函数返回值类型。...当你使用 const 断言构造新的表达式,可以给语言发出下面这些信号: 该表达式中的字面量类型不应被加宽(例如,不要从 “hello” 到 string) object 字面量获得 readonly...globalThis 提供了一种访问全局范围的标准方法,可以不同环境中使用。 参数转换为解构对象—— 实现了一个新的重构,现有函数转换为使用此“命名参数”模式。...存在多个参数的情况下,TypeScript 提供重构以参数列表转换为单个解构对象。 可以到官方发布说明了解有关 TypeScript 3.4 所有新功能的更多信息。

1.3K10

深入学习下 TypeScript 中的泛型

,允许开发人员类型作为参数递给另一种类型函数或其他结构。...TypeScript 完全支持泛型,以此类型安全性引入到接受参数和返回值的组件中,这些参数和返回值的类型稍后的代码中使用之前是不确定的。...如果仔细查看您的函数,您会发现参数列表或 TypeScript 能够推断其值的任何其他地方都没有使用泛型。这意味着调用代码调用您的函数必须显式传递此泛型的类型。...泛型与接口、类和类型一起使用 TypeScript 中创建接口和类,使用泛型类型参数来设置结果对象的形状会很有用。 例如,一个类可能具有不同类型的属性,具体取决于传递给构造函数的内容。...使用过程中,传递给 get 处理程序的参数类型将从传递给类构造函数的内容中正确推断出来。

38.8K30

初探 TypeScript函数基本类型泛型接口类内置对象

(类型推断:如果没有明确的指定类型,那么 TypeScript 会依照类型推论(Type Inference)的规则推断出一个类型。)...: 参数类型和返回值类型 TypeScript类型定义中, => 用来表示函数的定义,左边是输入类型,需要用括号括起来,右边是输出类型,和 ES6 的箭头函数不一样 可选参数和默认参数 TypeScript...里的每一个函数参数都是必须的,传递给函数参数个数必须与函数期望的参数个数一致,否则会报错。...;他有一个调用签名,参数列表和返回值类型函数定义,参数列表里的每一个参数都需要名字和类型函数参数名不需要与接口里定义的名字相匹配,如果你没有指定参数类型TypeScript类型系统会推断参数类型...readonly 关键字属性设置为只读,只读属性必须在声明或者构造函数里被初始 TypeScript 使用的是结构性类型系统,当我们比较两种不同的类型的时候,如果类型成员是兼容的,我们就认为他们类型是兼容的

7.2K31

TypeScript 官方手册翻译计划【一】:基础

静态类型检查 还记得之前我们字符串作为函数调用时,抛出的 TypeError 错误吗?大多数开发者执行代码不希望看到任何错误 —— 毕竟这些都是 bug!...复制代码 TypeScript 告诉我们,我们少了一个参数给 greet 函数 —— 这个报错是非常合理的。...最后,你不得不花费时间解决类型检查器抛出的错误,但问题在于,原始的 JavaScript 代码本身就是可以运行的!为什么把它们转换为 TypeScript 代码之后,反而就不能运行了呢?...复制代码 TypeScript 报错提示第二个参数有问题。为什么呢?...启用 noImplicitAny 配置项,遇到被隐式推断为 any 类型的变量就会抛出一个错误。

87610

TypeScript 5.4:带来新的类型和一些 Break Change

中是一个常见的类型推断过程,基于我们可能进行的某些检查或条件,TypeScript 能够自动推断出变量的具体类型,这就使得该变量的类型范围被“缩小”或者说“窄”。...可是,在数组的 map 方法中,TypeScript 不能保证 url 的类型已经窄化为 URL,因为他无法确定在回调函数被执行的当下,url是否仍然是 URL 对象,这是因为函数的闭包中,变量可能会被之后的代码改变...因此,TypeScript 5.4 做了改进,当参数和 let 变量非提升函数中使用时,类型检查器查找最后一个赋值点。...如果找到一个,TypeScript 可以从包含该函数的外部安全地窄,那上面的代码示例就可以正常工作了。 但是还需要注意一点,如果我们是嵌套函数中的任何地方对变量进行了赋值,类型收窄还是不起作用的。...这个过程我们称之为类型推断。 当你调用泛型函数,系统能够根据你传入的参数推断类型

21010

TypeScript 官方手册翻译计划【二】:普通类型

在学习类型本身的同时,我们也会学习如何在某些地方使用这些类型去组成新的结构。 首先,我们先来回顾一下编写 JavaScript 或者 TypeScript 代码最基础和最常用的类型。...TypeScript 允许你指定函数的输入和输出的类型参数类型注解 当你声明一个函数的时候,你可以每个参数后面添加类型注解,从而声明函数可以接受什么类型参数。...; } 当函数的某个参数类型注解的时候,TypeScript 会对传递给函数的实参进行类型检查: // 如果执行,会有一个运行时错误!...当一个函数出现在某个地方,且 TypeScript 可以推断它是如何被调用的时候,该函数参数会被自动分配类型。...当 TypeScript 能够基于代码结构推断出一个更具体的类型,就会发生收窄。

2.2K20

《现代Typescript高级教程》高级类型

条件类型与infer 当我们 TypeScript 中使用条件类型,有时候我们希望从某个类型中提取出一个部分类型并进行推断。这时就可以使用infer关键字。...当T是一个函数类型,我们使用infer R声明一个类型变量R来推断函数的返回类型,并将其作为结果返回。...通过调用ReturnType,我们函数add的类型递给ReturnType,从而提取并推断出其返回类型。...infer关键字是 TypeScript 中用于提取并推断待定类型的工具。它允许我们条件类型中声明一个类型变量,用于类型推断过程中捕获和使用待推断类型,从而使类型系统更加灵活和强大。...通过使用Greeting,我们可以字符串字面量类型'World'传递给模板字面量类型,从而创建一个具体的类型GreetingWorld,它的类型推断为"Hello, World!"

17230

C++ Template 基础篇(一):函数模板

Template 基础篇-函数模板 为什么要有泛型编程 函数模板定义 普通函数模板 成员函数模板 为什么成员函数模板不能是虚函数virtual 实参推断 如何使用 当返回值类型也是参数 实参推断的自动类型转换...函数模板重载 模板函数特化 为什么要有泛型编程 C++是一门强类型语言,所以无法做到像动态语言(python javascript)那样子,编写一段通用的逻辑,可以把任意类型的变量进去处理。...注意:模板定义本身不参与编译,而是编译器根据模板的用户使用模板提供的类型参数生成代码,再进行编译,这一过程被称为模板实例。用户提供不同的类型参数,就会实例化出不同的代码。...实参推断 为了方便使用,除了直接为函数模板指定类型参数之外,我们还可以让编译器从传递给函数的实参推断类型参数,这一功能被称为模板实参推断。...int (*pf) (const int&, const int&) = compare; //推断T的类型为int 当返回值类型也是参数 当一个模板函数的返回值类型需要用另外一个模板参数表示,你无法利用实参推断获取全部的类型参数

1.5K20

关于TypeScript中的泛型,希望这次能让你彻底理解

同时保持灵活和严格(关键词“扩展extend”与泛型) 当我们设计高阶组件(HOC),尤其是React或React Native的环境下,我们希望这些HOC只能应用于具有某些属性的组件。...比如,代码中看到这样的语句: const a: number = 12; 这意味着开发者可能并不知道TypeScript已经知道a是一个从值推断出来的数字类型。...通过这些例子,我们可以看到,TypeScript类型推断功能可以不牺牲类型安全的情况下,极大地简化代码。而泛型的灵活使用,则让我们的代码既严谨又富有弹性。...结束 我们今天的旅程中,我们一起探索了TypeScript中那些令人兴奋的泛型知识。从类型推断的便捷性到泛型日常编程中的灵活运用,希望这些内容能够帮助你解开围绕泛型的所有迷雾。...泛型的使用更是让组件和函数的复用性达到了新的高度。所以,当你下次遇到需要类型化处理多样数据的场景,别忘了,泛型就是你的得力助手

11610

React + TypeScript + Hook 带你手把手打造类型安全的应用。

: Payload)参数中,url参数和泛型U建立了关联,这样我们调用axios函数,就会动态的根据传入的url来确定上下文中U的类型,接下来用Payload把U传入Payload工具类型中...设置为可选,这就导致了一个问题,就是ts不能明确的知道哪些接口需要参,哪些接口不需要参。 注意下图中的payload是带?的。...的内置类型Exclude,用来传入的类型中排除某些类型,这里我们就有了两份类型,需要参的Url集合和无需参的Url集合。...但是就算是写宽松版本的TypeScript,带来的收益也远远比裸写JavaScript要高很多,尤其是别人需要复用你写的工具函数或者组件。...而且TypeScript也可以开发就避免很多粗心导致的错误,详见: TypeScript 解决了什么痛点?

1.8K10
领券