在努力更好地理解打字稿条件式打字时,我确实遇到了一个难题:我已经使它适用于指定的类型,但不适用于条件式。
我知道我想做的事可以通过重载实现,但是新的打字稿工具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[]
可能微不足道,但我找不到我在做错的事:/
预先感谢 塞巴
答案 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[]