Why typescript throws an error for two array of object types but doesn't on shape of both?
up vote
1
down vote
favorite
I have two simple types of data:
type IData =
percent: string;
exchange: string;
;
type IRow =
price: number;
exchange: string;
;
I'm not following why typescript throws errors here if I use them both:
const sumSame = (
assets: IData | IRow,
sumBy: string,
sumWhat: string
) =>
const mapWithUniqCoins = assets.reduce((accMap, el: IData ;
But it doesn't throw errors when I combine two types into one shape:
type Shape = IData | IRow;
Why it happened?
https://codesandbox.io/s/16vzvqqv3 (Check Errors.ts and NoErrors.ts)
javascript arrays typescript javascript-objects
add a comment |
up vote
1
down vote
favorite
I have two simple types of data:
type IData =
percent: string;
exchange: string;
;
type IRow =
price: number;
exchange: string;
;
I'm not following why typescript throws errors here if I use them both:
const sumSame = (
assets: IData | IRow,
sumBy: string,
sumWhat: string
) =>
const mapWithUniqCoins = assets.reduce((accMap, el: IData ;
But it doesn't throw errors when I combine two types into one shape:
type Shape = IData | IRow;
Why it happened?
https://codesandbox.io/s/16vzvqqv3 (Check Errors.ts and NoErrors.ts)
javascript arrays typescript javascript-objects
add a comment |
up vote
1
down vote
favorite
up vote
1
down vote
favorite
I have two simple types of data:
type IData =
percent: string;
exchange: string;
;
type IRow =
price: number;
exchange: string;
;
I'm not following why typescript throws errors here if I use them both:
const sumSame = (
assets: IData | IRow,
sumBy: string,
sumWhat: string
) =>
const mapWithUniqCoins = assets.reduce((accMap, el: IData ;
But it doesn't throw errors when I combine two types into one shape:
type Shape = IData | IRow;
Why it happened?
https://codesandbox.io/s/16vzvqqv3 (Check Errors.ts and NoErrors.ts)
javascript arrays typescript javascript-objects
I have two simple types of data:
type IData =
percent: string;
exchange: string;
;
type IRow =
price: number;
exchange: string;
;
I'm not following why typescript throws errors here if I use them both:
const sumSame = (
assets: IData | IRow,
sumBy: string,
sumWhat: string
) =>
const mapWithUniqCoins = assets.reduce((accMap, el: IData ;
But it doesn't throw errors when I combine two types into one shape:
type Shape = IData | IRow;
Why it happened?
https://codesandbox.io/s/16vzvqqv3 (Check Errors.ts and NoErrors.ts)
javascript arrays typescript javascript-objects
javascript arrays typescript javascript-objects
asked Nov 10 at 17:16
Avernikoz
998
998
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
up vote
1
down vote
accepted
When assets
are declared as a union of arrays
assets: IData | IRow
assets.reduce()
has different declarations in each array type: for IData
array, reduce()
takes a callback that receives IData
element, for IRow
array, reduce()
takes a callback that receives IRow
element.
The error message - "Cannot invoke an expression whose type lacks a call signature" - is basically telling that the compiles is not smart enough to recognize that it could be possible to call reduce()
for the union type, even when it receives appropriate callback type.
There is open issue for this:
This is currently by design because we don't synthesize an
intersectional call signature when getting the members of a union type
-- only call signatures which are identical appear on the unioned type
add a comment |
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
1
down vote
accepted
When assets
are declared as a union of arrays
assets: IData | IRow
assets.reduce()
has different declarations in each array type: for IData
array, reduce()
takes a callback that receives IData
element, for IRow
array, reduce()
takes a callback that receives IRow
element.
The error message - "Cannot invoke an expression whose type lacks a call signature" - is basically telling that the compiles is not smart enough to recognize that it could be possible to call reduce()
for the union type, even when it receives appropriate callback type.
There is open issue for this:
This is currently by design because we don't synthesize an
intersectional call signature when getting the members of a union type
-- only call signatures which are identical appear on the unioned type
add a comment |
up vote
1
down vote
accepted
When assets
are declared as a union of arrays
assets: IData | IRow
assets.reduce()
has different declarations in each array type: for IData
array, reduce()
takes a callback that receives IData
element, for IRow
array, reduce()
takes a callback that receives IRow
element.
The error message - "Cannot invoke an expression whose type lacks a call signature" - is basically telling that the compiles is not smart enough to recognize that it could be possible to call reduce()
for the union type, even when it receives appropriate callback type.
There is open issue for this:
This is currently by design because we don't synthesize an
intersectional call signature when getting the members of a union type
-- only call signatures which are identical appear on the unioned type
add a comment |
up vote
1
down vote
accepted
up vote
1
down vote
accepted
When assets
are declared as a union of arrays
assets: IData | IRow
assets.reduce()
has different declarations in each array type: for IData
array, reduce()
takes a callback that receives IData
element, for IRow
array, reduce()
takes a callback that receives IRow
element.
The error message - "Cannot invoke an expression whose type lacks a call signature" - is basically telling that the compiles is not smart enough to recognize that it could be possible to call reduce()
for the union type, even when it receives appropriate callback type.
There is open issue for this:
This is currently by design because we don't synthesize an
intersectional call signature when getting the members of a union type
-- only call signatures which are identical appear on the unioned type
When assets
are declared as a union of arrays
assets: IData | IRow
assets.reduce()
has different declarations in each array type: for IData
array, reduce()
takes a callback that receives IData
element, for IRow
array, reduce()
takes a callback that receives IRow
element.
The error message - "Cannot invoke an expression whose type lacks a call signature" - is basically telling that the compiles is not smart enough to recognize that it could be possible to call reduce()
for the union type, even when it receives appropriate callback type.
There is open issue for this:
This is currently by design because we don't synthesize an
intersectional call signature when getting the members of a union type
-- only call signatures which are identical appear on the unioned type
answered Nov 10 at 20:37
artem
13.5k12738
13.5k12738
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53241452%2fwhy-typescript-throws-an-error-for-two-array-of-object-types-but-doesnt-on-shap%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown