Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Typescript inferring Tuple as Array Incorrectly

Apologize for my English first.

I have a function like function func(): [string, string[]] which returns a Tuple. However, when I implement the return statement like

var test = ['text', ['foo', 'bar']];
return test;

Typescript inferred my return type as (string | string[])[] instead of [string, string[]].

Did I missed something or should I need to cast the return object as Tuple explicitly everytime like return <[string, string[]]>['text', ['foo', 'bar']]. If yes then isn't it quite annoying?

Provided the full function as follow:

function func(): [string, string[]] {
    var test= ['text', ['foo', 'bar']];

    return test;
}

Error: Type '(string | string[])[]' is missing the following properties from type '[string, string[]]': 0, 1ts(2739)

enter image description here

like image 256
mannok Avatar asked Oct 14 '25 03:10

mannok


1 Answers

TS cannot differentiate, if you want ['text', ['foo', 'bar']] to be an array or a tuple - the expression is the same! It will default to an array for the test variable type, if nothing else specified.

If you want a tuple, do one of the following:

  • use a const assertion
  • give test an explicit tuple type
function func(): [string, string[]] {
    const test = ['text', ['foo', 'bar']];
    const test2 = ['text', ['foo', 'bar']] as const;
    const test3: [string, string[]] = ['text', ['foo', 'bar']];
    // return test;   // error, was inferred as array
    // return test2; // works
    return test3; // works
}

With as const you don't have to repeat your type, but you will have to annotate the function return type with readonly modifiers: readonly [string, readonly [string, string]].

like image 155
ford04 Avatar answered Oct 18 '25 01:10

ford04



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!