当前位置: 首页 > 知识库问答 >
问题:

typescript - 关于TS类型推导中结果中,函数参数的类型问题?

汝宏伯
2024-02-15

关于TS类型推导中结果中,函数参数的类型问题?

链接在这里:https://tsplay.dev/mxE51W

type ClassNamesUtil = (value: string) => string;type ClassNames = (value: number) => string;interface WraperProps<T extends string | undefined = undefined> {    styles: T;    cx: T extends string ? ClassNamesUtil : ClassNames;}function action<T extends string | undefined = undefined>({ styles, cx }: WraperProps<T>) {        console.log(styles, cx('a'));}

问题是:

  1. 为什么在action中,调用cx('a')的时候,参数类型是never呢?
  2. 如何让cx根据传入的泛型T来决定接受的类型呢?

281707912317_.pic.jpg

共有2个答案

南门魁
2024-02-15

Tundefined 时,WraperProps 为:

interface WraperProps {    styles: undefined    cx: (value: number) => string}

函数调用 cx('a') 非法

陈成济
2024-02-15
  1. 为什么在action中,调用cx('a')的时候,参数类型是never呢?

在 TypeScript 中,never 类型表示一个值永远不会出现。在你的代码中,cx 的类型取决于 styles 的类型。如果 styles 是一个字符串,那么 cx 应该是 ClassNamesUtil 类型;如果 styles 不是字符串,那么 cx 应该是 ClassNames 类型。

然而,你的 action 函数没有明确的 T 类型参数。因此,当你在 action 函数内部调用 cx('a') 时,TypeScript 无法确定 T 的具体类型,所以它不知道 cx 的具体类型。因此,它不能推断出 cx('a') 的类型。由于没有明确的类型信息,TypeScript 将 cx('a') 的类型推断为 never

  1. 如何让cx根据传入的泛型T来决定接受的类型呢?

要解决这个问题,你需要明确指定 T 的类型。你可以通过在调用 action 函数时传递一个类型参数来实现这一点。例如:

action<string>({ styles: 'myStyle', cx: classNamesUtil });

在这个例子中,我们明确指定了 T 的类型为字符串,因此 TypeScript 可以推断出 cx 的类型为 ClassNamesUtil。然后,你可以在 cx('a') 中使用字符串类型的参数,而不会出现类型错误。

 类似资料:
  • options 怎么会是这个类型?应当是{ [key: string | number]: any }[] 才对啊。 是哪里出了问题?如何解决呢? "vue-tsc": "^1.8.27"

  • 我有一个类,它有一些属性/方法,返回最初通过构造函数传递的值: 人们建议用泛型作为打字稿的等价物: 现在我有了一个子类,它调用超类的构造函数并传递以下选项: TypeScript编译器对此不满意,希望通过类型扩展Base类。但是我有两次信息,在超级呼叫和扩展符号中。什么是正确的ts语法来解决我的问题? (键入脚本中的代码)

  • 我想通过TypeScript泛型定义函数返回类型。所以R可以是我将定义的任何东西。 <代码>。。。许诺 错误:(29,9)TS2322:类型“字符串”不可分配给类型“R”。“字符串”可分配给类型“R”的约束,但“R”可以用约束“{}”的不同子类型实例化。

  • 使用以下代码生成时 生成以下诊断(代码后): 诊断: 有趣的部分不是关于歧义错误本身(这不是这里主要关注的问题)。有趣的是,当仅使用函数名调用fun时,第一个fun的模板参数F被解析为纯函数类型double(double),而第二个fun的模板参数F被解析为更期望的函数指针类型。 然而,当我们将调用<代码>乐趣(测试) 更改为<代码>乐趣( 这种行为似乎是所有Clang和GCC(以及Visual

  • 在写这个问题之前,我看了以下链接: 未处理的异常:InternalLinkedHashMap 守则: 我只是不知道为什么错误存在,所以请帮帮我。谢谢你! 编辑:如果有助于解决问题,我可以将数据更改为限制

  • 在这个oracle java教程中,它说: TYPE_FORWARD_ONLY:结果集不能滚动;其光标仅向前移动,从第一行之前移动到最后一行之后。结果集中包含的行取决于基础数据库如何生成结果。也就是说,它包含在执行查询时或在检索行时满足查询的行。 “结果集中包含的行取决于基础数据库生成结果的方式。 查询执行时间和行检索时间有什么区别?我如何知道我的数据库支持哪些?提前致谢。