Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TypeScript:数组或数字的类型检查_Typescript - Fatal编程技术网

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是你想要表达感谢的类型。但这不适用于这种情况,是吗?