我在打字推论方面遇到了一个特殊的问题.
我目前正在开发一个pipe
函数,它采取一系列操作,其中每个后续操作都依赖于前一个操作的结果.
此外,我还创建了一个辅助操作集合,如first
,它从数组中 Select 第一项.
下面是一个精简的代码示例:
function pipe<T>(x: T[], fn: ((a: T[]) => T) | T):T {
if (typeof fn === 'function') return fn(x);
return fn;
}
function first<T extends any[]>(x: T):T[0] {
return x[0];
}
const result1 = pipe(["s", "t"], first);
// ^? any
const result2 = pipe(["s", "t"], (x) => x[0]);
// ^? string
在这个特定的场景中,我们预计result1
是string
,但实际上是any
.不过,这不是Result2的问题.
我不知道有什么问题. 谁能告诉我我错过了什么?
完整的代码相当大,我这里有:TS Playground.
我对代码进行了一些过度简化,@jcalz中的 idea 不能完全解释我的问题. 这是一个更合适的代码片段:
function pipe<A, B>(x: A, fn1: ((a: [A]) => B) | B): B {
return null as B;
}
function first<T>(x: [T[]]): T {
return x[0][0];
}
const result1 = pipe(["s", "t"], first);
// ^? const result1: unknown
const result2 = pipe(["s", "t"], (x) => first(x));
// ^? const result2: string
我没主意了.