我想编写一个接受这样的参数的打字稿函数:
myFunc([
{
initialValue: 6, // number
finalValue: 8 // number
},
{
initialValue: 'hello', // string
finalValue: 'goodbye' // string
}
])
但如果给出以下内容将会失败:
myFunc([
{
initialValue: 6, // number
finalValue: 'goodbye' // should fail because not a number!
}
])
感觉解决方案应该需要泛型,但是泛型是泛型的在每个数组项中,在整个数组中不是通用的。
EDIT:我想要一个适用于任何类型的值的解决方案,而不仅仅是字符串或整数。我可能也需要将其用于类/函数。
您可以使用泛型和映射类型来实现类似的功能。我们将使用类型参数来捕获参数的实际类型(无论是什么,即使它确实包含无效的初始/最终对)。然后我们将此类型转换为新类型,其中finalValue
是根据实际情况输入的initialValue
传入。我们将这个新类型与参数类型中的交集一起使用。这意味着参数的类型被推断到类型参数中,但对照转换后的类型进行检查:
type FinalValues<T extends Array<{ initialValue: any }>> = {
[P in keyof T]: T[P] extends { initialValue: infer I } ? { initialValue: I, finalValue: I }: never
}
function myFunc<T extends [{ initialValue: any }] | Array<{ initialValue: any }>>(v: T & FinalValues<T>): FinalValues<T> {
}
myFunc([
{
initialValue: 6, // number
finalValue: 8 // number
},
{
initialValue: 'hello', // string
finalValue: 'goodbye' // string
}
])
myFunc([
{
initialValue: 6, // number
finalValue: "string" // err
},
{
initialValue: 'hello', // string
finalValue: 1 // err
}
])
您还可以更有创意一点,添加一种自定义错误,以便错误更具可读性:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)