Typescript在数组解构后抱怨变量类型

Typescript在数组解构后抱怨变量类型,typescript,Typescript,我有一个函数 function foo() { return ["", 1, () => ""]; } 类型有:string、number和(()=>string) 但是在我分解这些值之后 const [str, num, func] = foo(); 编译器将每个变量视为类型:string | number |(()=>string) 我想在函数中传递这些变量,但编译器抱怨类型不匹配,我的IDE底层有红色文本。我能做什么?指定函数的返回

我有一个函数

function foo() {
    return ["", 1, () => ""];
}
类型有:
string
number
(()=>string)

但是在我分解这些值之后

const [str, num, func] = foo();
编译器将每个变量视为类型:
string | number |(()=>string)


我想在函数中传递这些变量,但编译器抱怨类型不匹配,我的IDE底层有红色文本。我能做什么?

指定函数的返回类型

function foo(): [string, number, () => string] {
    return ["", 1, () => ""];
}
这将严格键入函数以返回具有以下内容的数组:

  • 索引0的值为类型
    string
  • 索引1的值为类型<代码>编号<代码>
  • 索引2的值应为返回字符串的类型
    ()=>string
    /函数

指定函数的返回类型

function foo(): [string, number, () => string] {
    return ["", 1, () => ""];
}
这将严格键入函数以返回具有以下内容的数组:

  • 索引0的值为类型
    string
  • 索引1的值为类型<代码>编号<代码>
  • 索引2的值应为返回字符串的类型
    ()=>string
    /函数

默认情况下,TypeScript推断数组文字的类型不是作为元组,而是作为所有元素类型的并集的数组。所以在
常数x=[a,b,c]不是推断为具有类型
[A,B,C]
,而是
(A | B | C)[

如果希望TypeScript推断元组类型,则必须明确指出:

const x: [A, B, C] = [a, b, c]; // this typechecks
另一种方法是使用
as const
语法:

const x = [a, b, c] as const; // infers as `readonly [A, B, C]`

这不是TypeScript推断不太可能的特定类型的唯一地方。例如,字符串文本默认推断为
string
,而不是其文本类型:
let x=“word”;/字符串
vs
x=“word”作为常量;//“word”
vs
const x=“word”//“word”

默认情况下,TypeScript推断数组文字的类型不是元组,而是所有元素类型的并集的数组。所以在
常数x=[a,b,c]不是推断为具有类型
[A,B,C]
,而是
(A | B | C)[

如果希望TypeScript推断元组类型,则必须明确指出:

const x: [A, B, C] = [a, b, c]; // this typechecks
另一种方法是使用
as const
语法:

const x = [a, b, c] as const; // infers as `readonly [A, B, C]`

这不是TypeScript推断不太可能的特定类型的唯一地方。例如,字符串文本默认推断为
string
,而不是其文本类型:
let x=“word”;/字符串
vs
x=“word”作为常量;//“word”
vs
const x=“word”//“word”

实现这一点的另一种方法是:

函数foo(){
返回['',1,()=>''作为常量
}
常量[str,num,func]=foo()
与const
的主要区别在于:

  • as const
    告诉ts它是不可变的值,因此ts推断出具体的类型,在本例中,该类型是3的元组,正如您所知,元组可以有不同的类型
  • 如果不将
    设为常量
    ,ts将其推断为
    数组
    ,数组采用单一类型参数,但在本例中,数组包含字符串、数字和func值。因此ts将其推断为
    (string | number |()->string)[

    • 实现这一目标的另一种方法是:

      函数foo(){
      返回['',1,()=>''作为常量
      }
      常量[str,num,func]=foo()
      
      与const
      的主要区别在于:

      • as const
        告诉ts它是不可变的值,因此ts推断出具体的类型,在本例中,该类型是3的元组,正如您所知,元组可以有不同的类型
      • 如果不将
        设为常量
        ,ts将其推断为
        数组
        ,数组采用单一类型参数,但在本例中,数组包含字符串、数字和func值。因此ts将其推断为
        (string | number |()->string)[

      这很简单。谢谢:)我猜这是因为TS通过
      any
      数组推断返回类型?或
      未知
      ?TS在这种情况下如何推断类型?当您从函数返回数组时,Typescript会自动将返回类型设置为返回数组中所有可能的类型,这就是@MatasLiu get
      string | number |(()=>string)的原因
      对于每个返回的数组值类型,如@Curtis Fenner的回答中所述,而不是
      任何
      未知
      。如果你想严格地键入它,比如
      “索引0是字符串,索引1是数字,索引2是函数”
      ,你需要像我在回答中所做的那样声明返回类型。你的选择是不安全的,
      ,因为
      是一个危险的操作,我建议,如果你删除选择,那就好了;)这很简单。谢谢:)我猜这是因为TS通过
      any
      数组推断返回类型?或
      未知
      ?TS在这种情况下如何推断类型?当您从函数返回数组时,Typescript会自动将返回类型设置为返回数组中所有可能的类型,这就是@MatasLiu get
      string | number |(()=>string)的原因
      对于每个返回的数组值类型,如@Curtis Fenner的回答中所述,而不是
      任何
      未知
      。如果你想严格地键入它,比如
      “索引0是字符串,索引1是数字,索引2是函数”
      ,你需要像我在回答中所做的那样声明返回类型。你的选择是不安全的,
      ,因为
      是一个危险的操作,我建议,如果你删除选择,那就好了;)这绝对更优雅!这绝对更优雅!