如果我有以下代码:
interface Context {
id: number;
}
interface FunctionStep<T> {
(input?: any): (context: T) => (prevStepOutput?: any) => any;
}
function pipe<T extends Record<string, any>>(callbacks: Array<FunctionStep<T>>) {
return (context: T) => (...args: any) => {};
}
const context: Context = {
id: 12,
}
const clean: FunctionStep<number> = () => (context) => () => {}
pipe<Context>(clean())(context);
我希望TypeScript抱怨,因为我在应该期望FunctionStep<number>
的地方传递了FunctionStep<Context>
。为什么反而一切看起来都正确?
测试沙箱:https://codesandbox.io/s/brave-cookies-k51mb
如果这是预期的行为,我该如何限制传递给FunctionStep
的{{1}}为正确的pipe
类型的
答案 0 :(得分:0)
FunctionStep<T>
需要通用类型,这意味着T
可以是任何东西。
因此,调用FunctionStep<Context>
不会出错。
如果FunctionStep应该期望有一个Context,则没有理由使用泛型类型,则它应该是一个简单的参数。您也可以使用FunctionStep<T extends X | Y>
限制T可以使用。
答案 1 :(得分:0)
经过更多修改并考虑了@ kaya3的建议后,我发现了一种使其按预期方式运行的方法:
interface Context {
id: number;
}
interface FunctionStep<T> {
(context: T): (prevStepOutput?: any) => any;
}
function pipe<T extends Record<string, any>>(callbacks: Array<FunctionStep<T>>) {
return (context: T) => (...args: any) => {};
}
const context: Context = {
id: 12,
}
const clean = (): FunctionStep<Context> => (context) => () => {}
pipe<Context>(clean())(context);