gpt4 book ai didi

arrays - 如何在 Typescript 中检查数组的类型?

转载 作者:行者123 更新时间:2023-12-04 03:01:38 25 4
gpt4 key购买 nike

我有一个具有以下签名的函数

public async sequenceAnimations(animations: AnimationPlayer[] | AnimationTracker[]): Promise<any>

在函数本身中,我想根据它是 AnimationPlayer 数组还是 AnimationTracker 数组进行分支,所以我尝试了这个:
let mappedAnimations = animations;
if (animations instanceof Array<AnimationTracker>) {
mappedAnimations = animations.map(anim => anim.animationPlayer)
}

如您所见,我试图允许调用者传递 AnimationPlayer 数组或具有 animationPlayer 实例的 AnimationTracker 数组。但是在检查类型为 Array 的 instanceof 时出现错误

The right-hand side of an 'instanceof' expression must be of type 'any' or of a type assignable to the 'Function' interface type.



此外,自动完成没有在 if 块中注册数组的类型,所以我假设我无法像这样检查数组类型。

确定传递的数组类型的正确方法是什么?

最佳答案

您不能使用 instanceof具有带类型参数的泛型类型。编译后所有泛型都被删除,所以 animations instanceof Array<AnimationTracker>会变成 animations instanceof Array这不会做你期望它做的事情。

由于在 Javscript 数组中没有输入类型,因此没有内置方式来区分 AnimationPlayer[]AnimationTracker[]如果数组为空,则在运行时它们真的无法区分。但是,您可以创建一个自定义类型保护,它使用数组中的第一个非空项来确定类型。对于空数组,这将始终返回 false但在大多数情况下,这可能是一个不错的解决方案:

function isArrayOf<T>(array:any[], cls: new (...args: any[]) => T) : array is T[] {
for(let item of array) {
if(item != null) return item instanceof cls;
}
return false;
}
async function sequenceAnimations(animations: AnimationPlayer[] | AnimationTracker[]): Promise<any> {
let mappedAnimations = animations;
if (isArrayOf(animations, AnimationTracker)) {
// animations is AnimationTracker[]
mappedAnimations = animations.map(anim => anim.animationPlayer);
}
}

关于arrays - 如何在 Typescript 中检查数组的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48708298/

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