0
interface User extends Function {
    player: number,
    units: number[],
    sites: string[],
}
class User extends Function {
    constructor() {
        super('return this.player')
        [this.player, this.units, this.sites] = getBelongings(); // Destructuring Assignment
        
    }
}
const me = new User();
function getBelongings(): [number, number[], string[]] {
    return [1, [1], ['1']]
}

Playground Link

The above seems nice, and I think my assignment has no problem.

But It says: Type 'string[]' cannot be used as an index type.(2538)

I tried destructuring some times before and now have no idea about what's wrong.

Is it a TypeScript problem or a wrong syntax? And how can I make it operate well? Thanks a lot.

4
  • Destructuring arrays works like so : const [a, b] = myFunction() Commented Jul 5, 2022 at 12:00
  • please read this answer Commented Jul 5, 2022 at 12:00
  • 1
    You need a semi colon after the call to super, or it's trying to run both statements together. The code reads as an index accessor to the return value from super, instead of a new statement. Commented Jul 5, 2022 at 12:05
  • This is weird code; you're extending Function and calling super("return this.player"). I very much doubt this will behave the way you intend at runtime, and TypeScript certainly has no idea what kind of function your instances of User will be. Very little of that has to do with destructuring assignment; maybe you could edit the question to make it a plain example of your issue, like this. Commented Jul 5, 2022 at 12:13

1 Answer 1

3

You need a semi colon after the call to super, or it's trying to run both statements together.

The code, as it stands, reads as an index accessor to the return value from super, instead of a new statement.

super('return this.player');   // <-- insert semi colon
[this.player, this.units, this.sites] = getBelongings(); 
Sign up to request clarification or add additional context in comments.

1 Comment

Very good point, semicolon is not the only thing that fixes this, a comma would do the same, although it has different semantics

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.