You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript中扩展Array类型方法报错:"x" is not a function

问题原因及解决办法

核心报错原因

你遇到的ves.firstOrDefault is not a function错误,本质是代码执行顺序错误:你先调用了singularize("wives"),之后才给Array.prototype挂载firstOrDefault方法。当getIrregular里执行ves.firstOrDefault时,这个方法还没被添加到数组原型上,自然会被判定为不存在的函数。

修正步骤

  1. 调整代码顺序:把Array接口扩展和原型方法定义的代码,放到所有函数调用之前,确保调用方法时它已经存在。
  2. 修复实现细节:
    • 原代码用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 01:35:27