打字稿推断出输入与通用

时间:2018-11-09 02:49:14

标签: typescript

在努力更好地理解打字稿条件式打字时,我确实遇到了一个难题:我已经使它适用于指定的类型,但不适用于条件式。

我知道我想做的事可以通过重载实现,但是新的打字稿工具infer和条件键入使我们在类型定义中更加通用,因此不必重复太多。以下示例可以将原因简化为更好地表示为重载,但是当情况变得更加复杂时,情况可能并非如此。

无论如何,根据原则,我不理解自己所犯的错误;这是两个示例:
首先使用的类型

type In<T> = T | T[]
type Out<Type, T> = Type extends T ? T : T[]

然后显示指定的(有效)示例:

// No generic version 'string' is passed directly
const foo = <Type extends In<string>>(
  x: Type,
): Out<Type, string> => x as any

const a = foo ('abc')             // string as expected
const b = foo (['abc', 'def'])    // string[] as expected

最后是通用(无效)示例

// Generic version type should? be inferred
const bar = <T, Type extends In<T>>(
  x: Type,
): Out<Type, T> => x as any


const c = bar ('abc')             // {} -> Error expected string
const d = bar (['abc', 'def'])    // {} -> Error expected string[]

可能微不足道,但我找不到我在做错的事:/

预先感谢 塞巴

1 个答案:

答案 0 :(得分:0)

也许我对这个问题有误解(请澄清一下是否可以,所以我仍然可以为您提供帮助),但这不行吗?

function bar<T extends number>(x: T): number
function bar<T extends string>(x: T): string
function bar<T extends any>(x: T): T
function bar<T>(x: T): T {
  return null;
}

const c = bar('abc')             //string
const d = bar(['abc', 'def'])    //string[]