尝试构造可能长度为2的数组时出错

Suh*_*pta 2 javascript destructuring typescript ecmascript-6

我试图构造一个长度为2的数组,但我得到一个打字稿错误:

[ts] Tuple type '[string]' with length '1' cannot be assigned
to tuple with length '2'.
Run Code Online (Sandbox Code Playgroud)
    let output = {status: false};
    if(execute.permission) {
        let message: [string] = execute.params;
        if(message.length >= 2) {
            // Destructuring follows
            [output['position'], output['message']] = message;
        }
    }
Run Code Online (Sandbox Code Playgroud)

我怎么告诉打字稿,这个数组的长度可能是2?

car*_*ant 10

您还没有声明message为数组;您已将其声明为元组 ( [string]),并且元组具有固定数量的元素。(请参阅基本类型文档中的元组部分。)

您可以将其声明为具有两个字符串元素 ( ) 的元组[string, string],但考虑到您正在测试,message.length >= 2您似乎打算将其声明为字符串数组 ( string[]):

let output = {status: false};
if(execute.permission) {
    let message: string[] = execute.params;
    if(message.length >= 2) {
        // Destructuring follows
        [output['position'], output['message']] = message;
    }
}
Run Code Online (Sandbox Code Playgroud)


gyr*_*yre 5

使用string[](任何长度的数组)而不是[string]("元组"限制为长度1)作为您的类型.

元组具有特定的长度,并且更容易表示分配给特定索引位置的多个类型,例如[string, number].同源(单一类型)元组在某些情况下仍然有用(例如在地图中表示对),但不常见.

另一方面,数组是可变长度的列表,但设计为仅保存单个类型的引用(即使该类型是联合类型或any).如果任何数组的一个索引可以保存某个值,则每个索引都可以保存相同类型的值.


TypeScript代码(Playground Link)

let execute = { permission: true, params: ['a', 'b']}


let output = { status: false };
    if(execute.permission) {
        let message: string[] = execute.params;
        if(message.length >= 2) {
            // Destructuring follows
            [output['position'], output['message']] = message;
        }
}

console.log(output)
Run Code Online (Sandbox Code Playgroud)