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

TypeScript使用declare声明引用抛出未定义错误的原因及解决方法

结论

运行时抛出 greet is not defined 是 declare 关键字的预期行为,不属于异常。

declare 关键字的核心逻辑
  • declare 是TypeScript的类型层关键字,仅在TS类型检查阶段生效,编译为JavaScript的过程中会被完全擦除,不会生成任何可执行的运行时代码。
  • 写法declare function greet(setting: GreetingSettings): void;的语义是告诉TS编译器:「当前运行环境中已经存在一个名为greet的全局函数,入参符合GreetingSettings类型约束,你不需要校验它的实现,直接允许我调用即可」。
  • 你运行的示例代码中没有给出greet的实际实现,编译后declare相关代码完全消失,JS运行环境找不到greet这个函数实体,自然会抛出引用错误。

补充说明:TypeScript官方手册中这段代码属于「类型声明用法示例」,核心是演示接口对函数入参的约束能力,本身不是可直接运行的完整业务代码,没有提供运行时实现是示例的正常状态。

报错修复方案

根据实际业务场景二选一调整即可:

场景1:greet是需要自己实现业务逻辑的函数

直接删除declare关键字,补充函数的实际实现即可,可运行示例:

interface GreetingSettings {
  greeting: string;
  duration?: number;
  color?: string;
}

// 移除declare,补充函数实际逻辑
function greet(setting: GreetingSettings): void {
  const { greeting, duration = 3000, color = 'black' } = setting;
  // 这里写具体业务逻辑,比如渲染问候弹窗、设置动画时长、文字颜色等
  console.log(greeting, duration, color);
}

greet({
  greeting: "hello world",
  duration: 4000
});

场景2:greet是外部注入的全局方法(比如第三方SDK挂载的全局函数)

保留declare做类型声明,但是要确保运行环境中真的存在这个方法。比如在浏览器环境下,需要提前引入提供greet方法的第三方脚本,保证代码执行时全局作用域能访问到greet实体,再调用就不会报错。


内容的提问来源于stack exchange,提问作者Ugnius Malūkas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 23:12:33