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