TypeScript:数组或数字的类型检查
我试图实现一个具有固定属性的对象类型,其值为数组或数字TypeScript:数组或数字的类型检查,typescript,Typescript,我试图实现一个具有固定属性的对象类型,其值为数组或数字 type Gt = {$gt: Array<any> | number} export default (expression: Array<any> | number): Gt => { if (Array.isArray(expression)) { let gt: Gt = {$gt: []} const [key, value] = expression gt.$gt.p
type Gt = {$gt: Array<any> | number}
export default (expression: Array<any> | number): Gt => {
if (Array.isArray(expression)) {
let gt: Gt = {$gt: []}
const [key, value] = expression
gt.$gt.push(key, value)
return gt
} else {
return {$gt: expression}
}
}
type Gt={$Gt:Array | number}
导出默认值(表达式:数组|编号):Gt=>{
if(Array.isArray(表达式)){
设gt:gt={$gt:[]}
常量[键,值]=表达式
gt.$gt.推送(键,值)
返回燃气轮机
}否则{
返回{$gt:expression}
}
}
我得到以下错误:
src/operators/gt.ts(15,12):类型上不存在属性“push”
“编号|任意[]”
当我将其更改为
type Gt={$Gt:any}
时,它工作正常。我不明白为什么。当您显式地将其类型设置为gt
时,您正在覆盖TypeScript对所创建的gt
对象的理解
试着换线
let gt: Gt = {$gt: []}
到
在本例中,显式键入会覆盖TypeScript,因为它知道$gt
是一个数组,并告诉它是array | number
,即使您已显式将其设置为数组
执行此更改不会与函数的返回类型冲突,因为生成的对象仍然符合
Gt
类型。当您显式地将其类型设置为Gt
时,您正在覆盖TypeScript对正在创建的Gt
对象的理解
试着换线
let gt: Gt = {$gt: []}
到
在本例中,显式键入会覆盖TypeScript,因为它知道$gt
是一个数组,并告诉它是array | number
,即使您已显式将其设置为数组
执行此更改不会与函数的返回类型冲突,因为生成的对象仍然符合
Gt
类型。您的问题已经解决了
let gt: Gt = {$gt: []}
是的,您知道gt.$gt
包含一个数组,但是,通过将{$gt:[]}
强制转换为gt
,TypeScript编译器将丢失该信息,因此,当您稍后执行gt.$gt
时,它只知道gt
类型为gt
,因此$gt
可以包含数组或数字。这可能很愚蠢,但编译器无法跟踪以前的值类型以及类型信息
这就是为什么你不能这么做
const p : string = [];
但是如果你写的话,if是有效的
const p: string = [] as any;
因为[]
可以分配给任何
,而任何
可以分配给任何东西
您不需要将gt
声明为gt
,类型{$gt:Array}
可以分配给gt
,因此您应该这样编写函数:
(expression: Array<any> | number): Gt => {
if (Array.isArray(expression)) {
let gt = {$gt: []}
const [key, value] = expression
gt.$gt.push(key, value)
return gt
} else {
return {$gt: expression}
}
}
(表达式:数组|编号):Gt=>{
if(Array.isArray(表达式)){
设gt={$gt:[]}
常量[键,值]=表达式
gt.$gt.推送(键,值)
返回燃气轮机
}否则{
返回{$gt:expression}
}
}
你的问题就在眼前
let gt: Gt = {$gt: []}
是的,您知道gt.$gt
包含一个数组,但是,通过将{$gt:[]}
强制转换为gt
,TypeScript编译器将丢失该信息,因此,当您稍后执行gt.$gt
时,它只知道gt
类型为gt
,因此$gt
可以包含数组或数字。这可能很愚蠢,但编译器无法跟踪以前的值类型以及类型信息
这就是为什么你不能这么做
const p : string = [];
但是如果你写的话,if是有效的
const p: string = [] as any;
因为[]
可以分配给任何
,而任何
可以分配给任何东西
您不需要将gt
声明为gt
,类型{$gt:Array}
可以分配给gt
,因此您应该这样编写函数:
(expression: Array<any> | number): Gt => {
if (Array.isArray(expression)) {
let gt = {$gt: []}
const [key, value] = expression
gt.$gt.push(key, value)
return gt
} else {
return {$gt: expression}
}
}
(表达式:数组|编号):Gt=>{
if(Array.isArray(表达式)){
设gt={$gt:[]}
常量[键,值]=表达式
gt.$gt.推送(键,值)
返回燃气轮机
}否则{
返回{$gt:expression}
}
}
因为$gt可以是一个数字,而数字没有push-yo7,所以我会检查:如果(Array.isArray(expression))
。这对打字脚本来说还不够吗?我还能做什么呢?isArray
检查是在expression
上进行的,而不是在gt.$gt
上进行的,这是您正在调用的push
上。顺便说一句,您可以通过在元素前面添加
来强制转换元素。当然,type是你想要表达感谢的类型。但这不适用于这种情况,是吗?因为$gt可以是一个数字,而数字没有push-yo7,所以我会检查:if(Array.isArray(expression))
。这对打字脚本来说还不够吗?我还能做什么呢?isArray
检查是在expression
上进行的,而不是在gt.$gt
上进行的,这是您正在调用的push
上。顺便说一句,您可以通过在元素前面添加
来强制转换元素。当然,type是你想要表达感谢的类型。但这不适用于这种情况,是吗?