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

前端 - typescript 联合类型类型推断?

漆雕博
2023-04-22
type TestType = {
    value:string
    run:(v:string)=>void
  }
|
{
  value:string[],
  run:(v:string[])=>void
}
  
var obj:TestType = {
  value:'12',
  run:(val)=>{ // val为什么是any?而不是string?
  }
}

想实现value是string那么val就是string,value是string[]那么val就是string[]

共有1个答案

蒋俊人
2023-04-22

要实现这个需求,你可以使用 TypeScript 的联合类型和类型守卫。首先,将TestType类型定义为两个独立的类型,然后使用类型守卫在run函数内部确定value的类型。

type TestTypeString = {
  value: string;
  run: (v: string) => void;
};

type TestTypeStringArray = {
  value: string[];
  run: (v: string[]) => void;
};

type TestType = TestTypeString | TestTypeStringArray;

function isTestTypeString(obj: TestType): obj is TestTypeString {
  return typeof obj.value === "string";
}

var obj: TestType = {
  value: "12",
  run: (val) => {
    if (isTestTypeString(obj)) {
      // Now TypeScript knows that val is a string
      const newVal: string = val;
      // ...
    } else {
      // Now TypeScript knows that val is a string[]
      const newVal: string[] = val;
      // ...
    }
  },
};

上面的代码中,将TestType定义为两个独立的类型TestTypeStringTestTypeStringArray,然后将它们组合成一个联合类型TestType。接下来,我们创建了一个类型守卫函数isTestTypeString,以确定obj是否为TestTypeString类型。最后,在run函数内部,我们使用类型守卫函数来判断value的类型,从而使 TypeScript 能够正确推断val的类型。

 类似资料:
  • 主要内容:TypeScript,JavaScript,TypeScript,JavaScript,联合类型数组,TypeScript,JavaScript联合类型(Union Types)可以通过管道(|)将变量设置多种类型,赋值时可以根据设置的类型来赋值。 注意:只能赋值指定的类型,如果赋值其它类型就会报错。 创建联合类型的语法格式如下: 实例 声明一个联合类型: TypeScript var val:string|number val = 12 console.log("数字为 "+ val

  • 本节介绍联合类型,它使用管道符 | 把多个类型连起来,表示它可能是这些类型中的其中一个。我们把 | 理解成 or,这样便于轻松记忆。 1. 慕课解释 联合类型与交叉类型很有关联,但是使用上却完全不同。区别在于:联合类型表示取值为多种中的一种类型,而交叉类型每次都是多个类型的合并类型。 语法为:类型一 | 类型二。 2. 简单示例 联合类型之间使用竖线 “|” 分隔: let currentMont

  • TypeScript 类型检查机制包含三个部分: 类型推断 类型保护 类型兼容性 本节介绍其中的类型推断,类型推断主要用于那些没有明确指出类型的地方帮助确定和提供类型,这是 TypeScript 的一种能力。 类型推断是有方向的,要注意区分从左向右和从右向左两种推断的不同应用。 1. 慕课解释 类型推断的含义是不需要指定变量类型或函数的返回值类型,TypeScript 可以根据一些简单的规则推断其

  • 如果我有一个属性可能是字符串或布尔值,我该如何定义它: 我不想求助于: 我认为没有