TypeScript中扩展Array类型方法报错:"x" is not a function
问题原因及解决办法
核心报错原因
你遇到的ves.firstOrDefault is not a function错误,本质是代码执行顺序错误:你先调用了singularize("wives"),之后才给Array.prototype挂载firstOrDefault方法。当getIrregular里执行ves.firstOrDefault时,这个方法还没被添加到数组原型上,自然会被判定为不存在的函数。
修正步骤
- 调整代码顺序:把
Array接口扩展和原型方法定义的代码,放到所有函数调用之前,确保调用方法时它已经存在。 - 修复实现细节:
- 原代码用
for...in遍历数组会意外遍历到原型链上的属性,改用普通for循环更安全。 - 原型方法里的泛型
<T>和Array<T>接口的泛型重复,直接去掉即可避免类型冲突;同时返回值类型要明确包含null,符合TypeScript的类型规范。
- 原代码用
修正后的完整代码
// 先扩展Array接口与原型方法 interface Array<T> { firstOrDefault(predicate?: (o: T) => boolean): T | null; } Array.prototype.firstOrDefault = function(predicate?: (o: T) => boolean) { if (predicate === undefined) { return this.length > 0 ? this[0] : null; } // 使用普通for循环遍历数组,避免遍历原型属性 for (let i = 0; i < this.length; i++) { const item = this[i]; if (predicate(item)) { return item; } } return null; } // 再执行函数调用 console.log(singularize("wives")); function singularize(word: string): string { let irregular = getIrregular(word); // 后续逻辑补充 return word; } function getIrregular(word: string): string { let ves: string[] = ["halves", "calves", "lives", "wives", "leaves"]; let vesMatch = ves.firstOrDefault((vesWord: string) => vesWord.toLowerCase() === vesWord); // 后续逻辑补充 return ""; }
内容的提问来源于stack exchange,提问作者rory.ap
相关产品推荐
相关产品推荐

