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)

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:
test an explicit tuple typefunction 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]].
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With