gpt4 book ai didi

TypeScript:有没有办法对函数 arity 进行类型检查?

转载 作者:搜寻专家 更新时间:2023-10-30 20:53:59 25 4
gpt4 key购买 nike

给定以下代码:

type Function0<T> = () => T;
type Function1<T, A1> = (arg1: A1) => T;
type Function2<T, A1, A2> = (arg1: A1, arg2: A2) => T;

const foo: Function1<string, any> = () => "hi there";

我预计会出现某种错误,因为我试图断言某个 0 参数函数是一种采用一个参数的类型。

但是,下面的编译非常好。有什么方法可以类型检查这些参数是否完全匹配?

最佳答案

默认情况下,typescript 假定可以将具有较少参数的函数分配给将使用更多参数调用该函数的位置,因为额外的参数将被忽略并且不会造成任何伤害。一个合理的假设:

const foo: Function1<string, any> = () => "hi there";
foo("Ignored, but why would that be a problem ?")

也就是说,在某些情况下,我们可以强制传入的函数具有与预期参数数量相同的参数数量。这种情况涉及将函数传递给另一个函数,并使用一些条件类型在参数太少时强制出错:

type IsArg1Valid<T extends (...a: any) => any, E> = Parameters<T>['length'] extends 1 ? {} : E ;
function withFoo<T extends (arg: string) => any>(foo: T & IsArg1Valid<T, "You need to pass in a function with a first argument">){

}
withFoo(()=> {}) //Type '() => void' is not assignable to type '"You need to pass in a function with a first argument"'.
withFoo(a=> console.log(a)) //ok
withFoo((a, b)=> console.log(a))

Play

注意 如果传入参数较少的函数确实是一个错误,那么您应该仔细考虑一下,在运行时的所有情况下这样做应该是无害的。唯一的理由可能是调用者可能会忽略有用的传入参数,但这可能并不能证明强制每个人始终指定所有参数是合理的

关于TypeScript:有没有办法对函数 arity 进行类型检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51143582/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com