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[]
要实现这个需求,你可以使用 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
定义为两个独立的类型TestTypeString
和TestTypeStringArray
,然后将它们组合成一个联合类型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 可以根据一些简单的规则推断其
如果我有一个属性可能是字符串或布尔值,我该如何定义它: 我不想求助于: 我认为没有