繁体   English   中英

Typescript:function 当参数未定义或其类型已断言时,返回类型不同

[英]Typescript: function return type is different when a parameter is undefined or its type is asserted

需求

代码很简单,但我的用例很复杂:

type MyFn = <B extends ['A']>(
  param?: B
) => B extends undefined ? 'TYPE_1' : 'TYPE_2'

// so that
const test1 = myFn() // shall be type TYPE_1
const test2 = myFn(['A']) // shall be type TYPE_2
  • 我希望如果param未定义,则类型为'TYPE_1'否则为'TYPE_2'
  • param应该是动态类型的,目标是 IDE 在将值写入数组时自动完成/验证值
  • function 中的param类型至少应为 (string[] | undefined)

我试过的

我尝试了很多不同的配置都没有成功: typescript playground

我实际上能得到的最接近的是这段代码:

type MyFn = <
  T,
  B extends ['A']
>(
  param?: T | B
) => T extends string[] ? 'TYPE_2' : 'TYPE_1'

var a: MyFn3 = (param?) => (param ? 'TYPE_1' : 'TYPE_2') as any

const test1 = a() // IS type TYPE_1
const test2  = a(['A']) // IS be type TYPE_2

问题是 function 内部的推断类型是any因为T没有约束类型。 但是此时我们约束了T类型,返回类型中的条件总是返回 true。

有什么解决方案可以解决这个问题吗?


真实世界的用例

这种类型背后的主要目标是定义一个字符串数组作为 object 的 props 地址,并返回该地址的值。
例如: ['level1', 'level2']将返回myObject.level1.level2

这是这个真实世界用例的简化版本

您的B类型永远不会undefined ,因为['A']永远不会未定义。 编译器可以有效地简化你的表达式:

type MyFn = <B extends ['A']>(
  param?: B
) => B extends undefined ? 'TYPE_1' : 'TYPE_2'

type MyFn = <B extends ['A']>(
  param?: B
) => false ? 'TYPE_1' : 'TYPE_2'

type MyFn = <B extends ['A']>(
  param?: B
) => 'TYPE_2'

param是可选的B这一事实对B本身没有影响。

你需要扩大B

type MyFn = <B extends ['A'] | undefined>(

产生正确的结果

const test1 = myFn(undefined) // TYPE_1

然后在省略时默认使其工作:

type MyFn = <B extends ['A'] | undefined = undefined>(

产生正确的结果

const test1 = myFn() // TYPE_1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM