首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >条件类型的类型推理算法

条件类型的类型推理算法
EN

Stack Overflow用户
提问于 2022-08-29 14:36:24
回答 1查看 52关注 0票数 1

我想学习使用条件类型试图推断签名中类型的类型的算法。

示例1:这里的正确地推断了Tnumber

代码语言:javascript
复制
type Args<T> = { value: T }

function foo<T>(args: Args<T>) { return args; }

// correctly inferred as foo<number>
foo({ value: 123 });

示例2:条件类型和推断unknown

代码语言:javascript
复制
type StringOrNever<T> = T extends string ? string : never;
type Args<T> = { value: StringOrNever<T>; }

function foo<T>(args: Args<T>) { return args; }

// both calls inferred as foo<unknown> :(
foo({ value: 123 });
foo({ value: "some string" });

示例3:正确(或“预期”)推断但类型怪异

代码语言:javascript
复制
type StringOrNever<T> = T extends string ? string : never;
type Args<T> = { value: StringOrNever<T> & T; }

function foo<T>(args: Args<T>) { return args; }

// inferred as foo<number>
foo({ value: 123 });

// inferred as foo<"Typescript">
foo({ value: "Typescript" });

我想知道的是:

  1. 为什么在示例2中类型标推断为unknown,以及为什么会像我在示例(3)中所期望的那样推断T的类型?
  2. 如果有一些通用的算法,类型记录所遵循的,试图推断一个泛型类型参数。例如,尝试一个候选序列,其中第一个候选人总是一种论点,最后一个候选人是unknown (有点像最后的手段)。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-29 16:24:54

泛型类型推断在TypeScript中是一个复杂且有时难以理解的概念。但是,泛型类型必须在可以由给定参数的类型替换的位置使用。

所以,例如,1

代码语言:javascript
复制
function foo<T>(args: { value: T }) { return args; }

如果您传递一个{ value: string }类型的值,我们可以用string代替T

例2也不能这样说。

代码语言:javascript
复制
type StringOrNever<T> = T extends string ? string : never;

function foo<T>(args: { value: StringOrNever<T> }) { return args; }

T只用于比较部分的内容。在条件的右侧,我们只有stringneverT不在任何可以被给定类型替换的位置,因此unknown被推断为默认类型。

如果希望推理成功,则需要将T放在条件的右侧。

代码语言:javascript
复制
type StringOrNever<T> = T extends string ? T : never;

function foo<T>(args: { value: StringOrNever<T> }) { return args; }

这允许TypeScript根据给定类型的value推断T

游乐场

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73530465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档