🔎 Search Terms
"symbol", "generics", "serialization", "module", "export", "degression"
🕗 Version & Regression Information
The main behaviour can be categorized in 3 kinds in recent versions. Recommended to read code example first.
- This changed between versions 4.7 and 4.8
- But the details of its behaviour is continue to change subtly in next versions.
- I confirmed
g1 and g2 both can be exported without an error in:
- And both
g1 and g2 cannot be exported in:
- And only
g2 can be exported without an error.
⏯ Playground Link
https://www.typescriptlang.org/play/?ssl=1&ssc=1&pln=2&pc=1#code/KYDwDg9gTgLgBAYwgOwM7wGYQgZQJ4C2ARhADZwC8c+xZAFAORYQMCUA3AFCiSxwx4wwOADFsNEuSoChEDHGYSyXbuGjwkaTJTgAeACpxQMYMgAmqOBCIArYAhgA+OhlIBDAOYAuOCTLA3ZFZKRzg6ADcfQwAyOABvOABtAGk4AEtkUXFCSQBdHwBXZABrZAgAd0yAX2CKUISAegAqOFQIAmFSCA80hEsmhrgqrgbBjwBGHwBRKChoKIALYRlhOX4FtMsys2EEQLL4ImFUYCg0t1I0gC9gM197NwKT9JhLMDmhWDw4BkTFHLIuQYiH2EEOx1O50uNzMADo6AAWcbjAAcrFUvA0KHQcAmOgMRhAJnMlmsdgczlqoQwBmcMCgBWAHAx6kQ2PgHgATPjDMZTBYrLZ7E46FSwpE4DF4klUhksrgAaR8nAiqUKtUxQlNDjXJ4dPTGew4M1Wu1Ot1ev1BsNOEA
💻 Code
export const fooSymbol = Symbol('foo');
export type FooSymbol = typeof fooSymbol;
export const f = <T extends object>(flag: boolean) => (v: T & { [K in FooSymbol]: unknown }) => { /* some logics */ };
// g1: Error: The type of this node cannot be serialized because its property '[fooSymbol]' cannot be serialized.(4118)
export const g1 = <T extends object>() => f<T>(true);
export const g2 = <T extends object>() => (v: T & { [K in FooSymbol]: unknown }) => { const flag = true; /* some logics */ };
🙁 Actual behavior
The function g1 seems correctly typed, exported, but error is shown as The type of this node cannot be serialized because its property '[fooSymbol]' cannot be serialized.(4118) by the compiler.
g1 is potentially rewritten in the form of g2, just directly rewrite the given arguments as local constant (or just embed values in all contexts).
🙂 Expected behavior
g1 is acceptable as well as g2.
Additional information about the issue
Generics usage is essential to reproduce this case. I'm not sure if the code example could be minimized.
It's the real case minimization of what I really needed in my projects.
🔎 Search Terms
"symbol", "generics", "serialization", "module", "export", "degression"
🕗 Version & Regression Information
The main behaviour can be categorized in 3 kinds in recent versions. Recommended to read code example first.
g1andg2both can be exported without an error in:g1andg2cannot be exported in:g2can be exported without an error.⏯ Playground Link
https://www.typescriptlang.org/play/?ssl=1&ssc=1&pln=2&pc=1#code/KYDwDg9gTgLgBAYwgOwM7wGYQgZQJ4C2ARhADZwC8c+xZAFAORYQMCUA3AFCiSxwx4wwOADFsNEuSoChEDHGYSyXbuGjwkaTJTgAeACpxQMYMgAmqOBCIArYAhgA+OhlIBDAOYAuOCTLA3ZFZKRzg6ADcfQwAyOABvOABtAGk4AEtkUXFCSQBdHwBXZABrZAgAd0yAX2CKUISAegAqOFQIAmFSCA80hEsmhrgqrgbBjwBGHwBRKChoKIALYRlhOX4FtMsys2EEQLL4ImFUYCg0t1I0gC9gM197NwKT9JhLMDmhWDw4BkTFHLIuQYiH2EEOx1O50uNzMADo6AAWcbjAAcrFUvA0KHQcAmOgMRhAJnMlmsdgczlqoQwBmcMCgBWAHAx6kQ2PgHgATPjDMZTBYrLZ7E46FSwpE4DF4klUhksrgAaR8nAiqUKtUxQlNDjXJ4dPTGew4M1Wu1Ot1ev1BsNOEA
💻 Code
🙁 Actual behavior
The function
g1seems correctly typed, exported, but error is shown asThe type of this node cannot be serialized because its property '[fooSymbol]' cannot be serialized.(4118)by the compiler.g1is potentially rewritten in the form ofg2, just directly rewrite the given arguments as local constant (or just embed values in all contexts).🙂 Expected behavior
g1is acceptable as well asg2.Additional information about the issue
Generics usage is essential to reproduce this case. I'm not sure if the code example could be minimized.
It's the real case minimization of what I really needed in my projects.