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

使用new User()创建实例报错:‘User仅指类型却被用作值’的解决问询

问题分析与解决方案

没错,你遇到的报错完全是因为User被声明为接口导致的!

在TypeScript里,接口只是用来做类型约束的“蓝图”——它只定义了对象应该有哪些属性和类型,编译成JavaScript后会被完全移除,根本不是一个可以用new实例化的构造函数。所以当你写new User(...)时,TypeScript会提示你“User是类型而非值”,因为它找不到对应的可实例化对象。

下面给你两种常见的解决方法,按需选择:

方法一:把User接口改成类

如果你确实需要通过new来创建用户实例(比如需要在类里添加方法),可以把接口改成类:

export class User {
  constructor(
    public id: string | null,
    public cin: string,
    public familyName: string,
    public givenName: string,
    public email: string,
    public description?: string, // 你的表单里用到了这个字段,接口里没定义,用可选参数处理
    public code?: string, // 同理处理表单里的code字段
    public role: string = 'user' // 接口里必填的role字段,这里给个默认值或者设为必填参数
  ) {}
}

改完之后,你原来的new User(...)代码就能正常运行了——类是可以被实例化的,同时TypeScript依然会帮你做类型检查,确保你传递的参数符合要求。

方法二:直接创建符合接口的字面量对象

如果只是需要一个符合User接口的数据对象来传递给服务(比如调用createUser接口),没必要创建类,直接写对象字面量就行:

onSubmit() {
  if (this.userForm.valid) {
    const user: User = {
      id: null,
      cin: this.userForm.controls['cin'].value,
      familyName: this.userForm.controls['familyName'].value,
      givenName: this.userForm.controls['givenName'].value,
      email: this.userForm.controls['email'].value,
      role: 'user' // 注意:接口里的role是必填字段,必须提供值
      // 另外,你的表单里用到了description和code,但接口里没定义,如果需要传递这两个字段,记得先更新User接口
    };
    this.adminService.createUser(user).subscribe();
  }
}

这种方式更轻量,因为不需要额外定义类,完全利用TypeScript的类型检查来确保对象结构正确。如果description和code是后端需要的字段,记得先把它们添加到User接口里:

export interface User {
  cin: string;
  givenName: string;
  familyName: string;
  role: string;
  id: string;
  email: string;
  description?: string; // 可选字段用?标记
  code?: string;
}

内容的提问来源于stack exchange,提问作者Jeizi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:47:43