当前位置: 首页 > 知识库问答 >
问题:

在TypeScript中使用instanceof查找函数的返回类型会导致“引用类型,但在此处用作值”

松灿
2023-03-14

我使用TypeScript,并有一个情况下,一个函数返回两个类型的联合。它可以返回字符串或模型,但我不知道如何获取类型并根据返回的类型执行操作。

我该怎么做这样的事?在本例中,字符串和IMyModel如何用作值(如错误消息所示)?这个错误使我感到困惑。

export interface IMyModel {
  id: number;
  name: string;
}

const myFunc = (value: boolean): string | IMyModel => {
  if (value) return "a string";

  return {
    id: 12,
    name: "model",
  };
};

const a = myFunc(true);

if (a instanceof string) {
  console.log("it is a string");
}

if (a instanceof IMyModel) {
  console.log("it is a model");
}

我在使用instanceof的行中得到以下可视化工作室代码中的静态错误:

“string”仅引用类型,但在此处用作值。ts(2693)

“IMyModel”仅引用类型,但在此处用作值。ts(2693)

我还将界面切换为使用“type”,但这是相同的。

共有3个答案

周弘盛
2023-03-14

构造函数的对象实例中的右侧参数应为构造函数/函数。

instanceof运算符测试对象的原型链中是否存在constructor.prototype

更多信息请点击这里

回到你的例子。一种可能的解决方案是测试类型的a是否是的“字符串”

if (typeof a === 'string') {
  a // a is of type string here
  console.log("it is a string");
} else {
  a // a is IModel
  console.log("it is a model");
}

游戏场

更多关于防护装置类型的信息

祁建业
2023-03-14

要检查某个内容是否是字符串,您可以使用与JavaScript相同的方法进行检查

if (typeof a === "string")

接口纯粹是一个TypeScript构造,不存在于传输的JavaScript中。因为它是一个联合体,所以可以假设如果它不是字符串,那么它必须是IMyModel

谭研
2023-03-14

Typescript是javascript的超集,最终编译为javascript。尽管如此,重要的是要考虑您正在编写的代码将是什么样子的javascript。以下是编译后的结果:

const myFunc = value => {
  if (value) return "a string";
  return {
    id: 12,
    name: "model"
  };
};
const a = myFunc(true);
if (a instanceof string) {
  console.log("it is a string");
}
if (a instanceof IMyModel) {
  console.log("it is a model");
}

您会注意到您声明的类型被编译掉了。这个错误现在开始变得更有意义了。我们不能对typescript类型调用instanceof,因为就编译的javascript而言,它们并不存在。您可能正在寻找以下任一项:

typeoftype防护装置

if (typeof a === 'string') {
  console.log("it is a string");
}

用户定义的类型保护:

const isMyModel = (model: any): model is IMyModel => {
  return typeof model === 'object' && Boolean(model.id && model.name)
}
if (isMyModel(a)) {
  console.log("it is a model");
}

或者两者都有!

 类似资料:
  • 问题内容: 我有一个旧类,该类本身不是泛型,但其方法返回类型之一使用泛型: 使用泛型返回字符串的集合。因此,我可以进行遍历,而无需将元素强制转换为: 但是,如果我将自己更改为通用名称,但其他所有内容均保持不变: 然后继续使用对的非泛型引用,不再返回,而是返回非类型。因此,客户端代码无法编译: 为什么是这样?有哪些解决方法? 我的猜测是,通过使用对泛型类的非泛型引用,Java将关闭整个类的所有泛型。

  • 我试图为我的AWS Lambda使用Typescript,我在使用promise时遇到了以下错误。 我尝试在代码中使用以下变体 我尝试了I Get中提到的解决方案:[ts]'Promise'只引用类型,但在这里被用作值,但没有运气。

  • 我使用的是Typescript 3.2。2、无法实现最基本的类型防护: 这将产生源自。是否需要配置来启用此语法?

  • 给出了以下错误: 仅引用类型,但在此处用作值。 这是可以理解的,因为它是对象的属性。 如何使用指定类型,如one?

  • 这是简化的代码 那么如何在类型注释中使用名称Myclass呢?我的TypeScript版本是3.2.2

  • 我想通过TypeScript泛型定义函数返回类型。所以R可以是我将定义的任何东西。 <代码>。。。许诺 错误:(29,9)TS2322:类型“字符串”不可分配给类型“R”。“字符串”可分配给类型“R”的约束,但“R”可以用约束“{}”的不同子类型实例化。