Breaking changes associated with Union Types #868

Description

@danquirk

This issue tracks the set of breaking changes that result from the change to union types #824 to implement the suggestion #805. The issues here will be formalized further once an official spec update is done, until then it will mostly serve as an easy reference for the type of coding patterns that have broken for various reasons.

Multiple Best Common Type Candidates

Given multiple viable candidates from a Best Common Type computation we now choose an item (depending on the compiler's implementation) rather than the first item.

vara: {x: number;y?: number};varb: {x: number;z?: number};// was { x: number; z?: number; }[]// now { x: number; y?: number; }[]varbs=[b,a];

This can happen in a variety of circumstances. A shared set of required properties and a disjoint set of other properties (optional or otherwise), empty types, compatible signature types (including generic and non-generic signatures when type parameters are stamped out with any).

Recommendation
Provide a type annotation if you need a specific type to be chosen

varbs: {x: number;y?: number;z?: number}[]=[b,a];

Generic Type Inference

Using different types for multiple arguments of type T is now an error, even with constraints involved:

declarefunctionfoo<T>(x: T,y:T): T;varr=foo(1,"");// r used to be {}, now this is an error

With constraints:

interfaceAnimal{x}interfaceGiraffeextendsAnimal{y}interfaceElephantextendsAnimal{z}functionf<TextendsAnimal>(x: T,y: T): T{returnundefined;}varg: Giraffe;vare: Elephant;f(g,e);

See #824 (comment) for explanation.

Recommendations
Specify an explicit type parameter if the mismatch was intentional:

varr=foo<{}>(1,"");// Emulates 1.0 behaviorvarr=foo<string|number>(1,"");// Most usefulvarr=foo<any>(1,"");// Easiestf<Animal>(g,e);

or rewrite the function definition to specify that mismatches are OK:

declarefunctionfoo<T,U>(x: T,y:U): T|U;functionf<TextendsAnimal,UextendsAnimal>(x: T,y: U): T|U{returnundefined;}

Generic Rest Parameters

You cannot use hetergeneous argument types anymore:

functionmakeArray<T>(...items: T[]): T[]{returnitems;}varr=makeArray(1,"");// used to return {}[], now an error

Likewise for new Array(...)

Recommendations
Declare a back-compat signature if the 1.0 behavior was desired:

functionmakeArray<T>(...items: T[]): T[];functionmakeArray(...items: {}[]): {}[];functionmakeArray<T>(...items: T[]): T[]{returnitems;}

Overload Resolution with Type Argument Inference

varf10: <T>(x: T,b: ()=>(a: T)=>void,y: T)=>T;varr9=f10('',()=>(a=>a.foo),1);// r9 was any, now this is an error

Recommendations
Manually specify a type parameter

varr9=f10<any>('',()=>(a=>a.foo),1);

Promises

This used to not have an error:

interfacePromise<T>{then<U>(success?: (value: T)=>Promise<U>,error?: (error: any)=>Promise<U>,progress?: (progress: any)=>void): Promise<U>;then<U>(success?: (value: T)=>Promise<U>,error?: (error: any)=>U,progress?: (progress: any)=>void): Promise<U>;then<U>(success?: (value: T)=>U,error?: (error: any)=>Promise<U>,progress?: (progress: any)=>void): Promise<U>;then<U>(success?: (value: T)=>U,error?: (error: any)=>U,progress?: (progress: any)=>void): Promise<U>;done<U>(success?: (value: T)=>any,error?: (error: any)=>any,progress?: (progress: any)=>void): void;}interfaceIPromise<T>{then<U>(success?: (value: T)=>IPromise<U>,error?: (error: any)=>IPromise<U>,progress?: (progress: any)=>void): IPromise<U>;then<U>(success?: (value: T)=>IPromise<U>,error?: (error: any)=>U,progress?: (progress: any)=>void): IPromise<U>;then<U>(success?: (value: T)=>U,error?: (error: any)=>IPromise<U>,progress?: (progress: any)=>void): IPromise<U>;then<U>(success?: (value: T)=>U,error?: (error: any)=>U,progress?: (progress: any)=>void): IPromise<U>;done? <U>(success?: (value: T)=>any,error?: (error: any)=>any,progress?: (progress: any)=>void): void;}declarefunctionf1(x: number): IPromise<number>;declarefunctionf2(x: number): Promise<number>;varp: Promise<number>;varr=p.then(f2,f1,f1).then(f1,f1,f1);// ^^// error TS2345: Argument of type '(x: number) => IPromise<number>' is not assignable to parameter of type '(value: IPromise<number>) => IPromise<number>'.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Breaking ChangeWould introduce errors in existing codeBy DesignDeprecated - use "Working as Intended" or "Design Limitation" instead

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
       blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
      }
      } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
      })();
      (function(){
      try {
      var __m = "github.com";
      var __re = new RegExp('^' + "github\\.com" + '
      
      Skip to content

      Breaking changes associated with Union Types #868

      Description

      @danquirk

      This issue tracks the set of breaking changes that result from the change to union types #824 to implement the suggestion #805. The issues here will be formalized further once an official spec update is done, until then it will mostly serve as an easy reference for the type of coding patterns that have broken for various reasons.

      Multiple Best Common Type Candidates

      Given multiple viable candidates from a Best Common Type computation we now choose an item (depending on the compiler's implementation) rather than the first item.

      vara: {x: number;y?: number};varb: {x: number;z?: number};// was { x: number; z?: number; }[]// now { x: number; y?: number; }[]varbs=[b,a];

      This can happen in a variety of circumstances. A shared set of required properties and a disjoint set of other properties (optional or otherwise), empty types, compatible signature types (including generic and non-generic signatures when type parameters are stamped out with any).

      Recommendation
      Provide a type annotation if you need a specific type to be chosen

      varbs: {x: number;y?: number;z?: number}[]=[b,a];

      Generic Type Inference

      Using different types for multiple arguments of type T is now an error, even with constraints involved:

      declarefunctionfoo<T>(x: T,y:T): T;varr=foo(1,"");// r used to be {}, now this is an error

      With constraints:

      interfaceAnimal{x}interfaceGiraffeextendsAnimal{y}interfaceElephantextendsAnimal{z}functionf<TextendsAnimal>(x: T,y: T): T{returnundefined;}varg: Giraffe;vare: Elephant;f(g,e);

      See #824 (comment) for explanation.

      Recommendations
      Specify an explicit type parameter if the mismatch was intentional:

      varr=foo<{}>(1,"");// Emulates 1.0 behaviorvarr=foo<string|number>(1,"");// Most usefulvarr=foo<any>(1,"");// Easiestf<Animal>(g,e);

      or rewrite the function definition to specify that mismatches are OK:

      declarefunctionfoo<T,U>(x: T,y:U): T|U;functionf<TextendsAnimal,UextendsAnimal>(x: T,y: U): T|U{returnundefined;}

      Generic Rest Parameters

      You cannot use hetergeneous argument types anymore:

      functionmakeArray<T>(...items: T[]): T[]{returnitems;}varr=makeArray(1,"");// used to return {}[], now an error

      Likewise for new Array(...)

      Recommendations
      Declare a back-compat signature if the 1.0 behavior was desired:

      functionmakeArray<T>(...items: T[]): T[];functionmakeArray(...items: {}[]): {}[];functionmakeArray<T>(...items: T[]): T[]{returnitems;}

      Overload Resolution with Type Argument Inference

      varf10: <T>(x: T,b: ()=>(a: T)=>void,y: T)=>T;varr9=f10('',()=>(a=>a.foo),1);// r9 was any, now this is an error

      Recommendations
      Manually specify a type parameter

      varr9=f10<any>('',()=>(a=>a.foo),1);

      Promises

      This used to not have an error:

      interfacePromise<T>{then<U>(success?: (value: T)=>Promise<U>,error?: (error: any)=>Promise<U>,progress?: (progress: any)=>void): Promise<U>;then<U>(success?: (value: T)=>Promise<U>,error?: (error: any)=>U,progress?: (progress: any)=>void): Promise<U>;then<U>(success?: (value: T)=>U,error?: (error: any)=>Promise<U>,progress?: (progress: any)=>void): Promise<U>;then<U>(success?: (value: T)=>U,error?: (error: any)=>U,progress?: (progress: any)=>void): Promise<U>;done<U>(success?: (value: T)=>any,error?: (error: any)=>any,progress?: (progress: any)=>void): void;}interfaceIPromise<T>{then<U>(success?: (value: T)=>IPromise<U>,error?: (error: any)=>IPromise<U>,progress?: (progress: any)=>void): IPromise<U>;then<U>(success?: (value: T)=>IPromise<U>,error?: (error: any)=>U,progress?: (progress: any)=>void): IPromise<U>;then<U>(success?: (value: T)=>U,error?: (error: any)=>IPromise<U>,progress?: (progress: any)=>void): IPromise<U>;then<U>(success?: (value: T)=>U,error?: (error: any)=>U,progress?: (progress: any)=>void): IPromise<U>;done? <U>(success?: (value: T)=>any,error?: (error: any)=>any,progress?: (progress: any)=>void): void;}declarefunctionf1(x: number): IPromise<number>;declarefunctionf2(x: number): Promise<number>;varp: Promise<number>;varr=p.then(f2,f1,f1).then(f1,f1,f1);// ^^// error TS2345: Argument of type '(x: number) => IPromise<number>' is not assignable to parameter of type '(value: IPromise<number>) => IPromise<number>'.

      Activity

      Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

      Metadata

      Metadata

      Assignees

      No one assigned

        Labels

        Breaking ChangeWould introduce errors in existing codeBy DesignDeprecated - use "Working as Intended" or "Design Limitation" instead

        Type

        No type

        Projects

        No projects

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
          Skip to content

          Breaking changes associated with Union Types #868

          Description

          @danquirk

          This issue tracks the set of breaking changes that result from the change to union types #824 to implement the suggestion #805. The issues here will be formalized further once an official spec update is done, until then it will mostly serve as an easy reference for the type of coding patterns that have broken for various reasons.

          Multiple Best Common Type Candidates

          Given multiple viable candidates from a Best Common Type computation we now choose an item (depending on the compiler's implementation) rather than the first item.

          vara: {x: number;y?: number};varb: {x: number;z?: number};// was { x: number; z?: number; }[]// now { x: number; y?: number; }[]varbs=[b,a];

          This can happen in a variety of circumstances. A shared set of required properties and a disjoint set of other properties (optional or otherwise), empty types, compatible signature types (including generic and non-generic signatures when type parameters are stamped out with any).

          Recommendation
          Provide a type annotation if you need a specific type to be chosen

          varbs: {x: number;y?: number;z?: number}[]=[b,a];

          Generic Type Inference

          Using different types for multiple arguments of type T is now an error, even with constraints involved:

          declarefunctionfoo<T>(x: T,y:T): T;varr=foo(1,"");// r used to be {}, now this is an error

          With constraints:

          interfaceAnimal{x}interfaceGiraffeextendsAnimal{y}interfaceElephantextendsAnimal{z}functionf<TextendsAnimal>(x: T,y: T): T{returnundefined;}varg: Giraffe;vare: Elephant;f(g,e);

          See #824 (comment) for explanation.

          Recommendations
          Specify an explicit type parameter if the mismatch was intentional:

          varr=foo<{}>(1,"");// Emulates 1.0 behaviorvarr=foo<string|number>(1,"");// Most usefulvarr=foo<any>(1,"");// Easiestf<Animal>(g,e);

          or rewrite the function definition to specify that mismatches are OK:

          declarefunctionfoo<T,U>(x: T,y:U): T|U;functionf<TextendsAnimal,UextendsAnimal>(x: T,y: U): T|U{returnundefined;}

          Generic Rest Parameters

          You cannot use hetergeneous argument types anymore:

          functionmakeArray<T>(...items: T[]): T[]{returnitems;}varr=makeArray(1,"");// used to return {}[], now an error

          Likewise for new Array(...)

          Recommendations
          Declare a back-compat signature if the 1.0 behavior was desired:

          functionmakeArray<T>(...items: T[]): T[];functionmakeArray(...items: {}[]): {}[];functionmakeArray<T>(...items: T[]): T[]{returnitems;}

          Overload Resolution with Type Argument Inference

          varf10: <T>(x: T,b: ()=>(a: T)=>void,y: T)=>T;varr9=f10('',()=>(a=>a.foo),1);// r9 was any, now this is an error

          Recommendations
          Manually specify a type parameter

          varr9=f10<any>('',()=>(a=>a.foo),1);

          Promises

          This used to not have an error:

          interfacePromise<T>{then<U>(success?: (value: T)=>Promise<U>,error?: (error: any)=>Promise<U>,progress?: (progress: any)=>void): Promise<U>;then<U>(success?: (value: T)=>Promise<U>,error?: (error: any)=>U,progress?: (progress: any)=>void): Promise<U>;then<U>(success?: (value: T)=>U,error?: (error: any)=>Promise<U>,progress?: (progress: any)=>void): Promise<U>;then<U>(success?: (value: T)=>U,error?: (error: any)=>U,progress?: (progress: any)=>void): Promise<U>;done<U>(success?: (value: T)=>any,error?: (error: any)=>any,progress?: (progress: any)=>void): void;}interfaceIPromise<T>{then<U>(success?: (value: T)=>IPromise<U>,error?: (error: any)=>IPromise<U>,progress?: (progress: any)=>void): IPromise<U>;then<U>(success?: (value: T)=>IPromise<U>,error?: (error: any)=>U,progress?: (progress: any)=>void): IPromise<U>;then<U>(success?: (value: T)=>U,error?: (error: any)=>IPromise<U>,progress?: (progress: any)=>void): IPromise<U>;then<U>(success?: (value: T)=>U,error?: (error: any)=>U,progress?: (progress: any)=>void): IPromise<U>;done? <U>(success?: (value: T)=>any,error?: (error: any)=>any,progress?: (progress: any)=>void): void;}declarefunctionf1(x: number): IPromise<number>;declarefunctionf2(x: number): Promise<number>;varp: Promise<number>;varr=p.then(f2,f1,f1).then(f1,f1,f1);// ^^// error TS2345: Argument of type '(x: number) => IPromise<number>' is not assignable to parameter of type '(value: IPromise<number>) => IPromise<number>'.

          Activity

          Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

          Metadata

          Metadata

          Assignees

          No one assigned

            Labels

            Breaking ChangeWould introduce errors in existing codeBy DesignDeprecated - use "Working as Intended" or "Design Limitation" instead

            Type

            No type

            Projects

            No projects

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
              Skip to content

              Breaking changes associated with Union Types #868

              Description

              @danquirk

              This issue tracks the set of breaking changes that result from the change to union types #824 to implement the suggestion #805. The issues here will be formalized further once an official spec update is done, until then it will mostly serve as an easy reference for the type of coding patterns that have broken for various reasons.

              Multiple Best Common Type Candidates

              Given multiple viable candidates from a Best Common Type computation we now choose an item (depending on the compiler's implementation) rather than the first item.

              vara: {x: number;y?: number};varb: {x: number;z?: number};// was { x: number; z?: number; }[]// now { x: number; y?: number; }[]varbs=[b,a];

              This can happen in a variety of circumstances. A shared set of required properties and a disjoint set of other properties (optional or otherwise), empty types, compatible signature types (including generic and non-generic signatures when type parameters are stamped out with any).

              Recommendation
              Provide a type annotation if you need a specific type to be chosen

              varbs: {x: number;y?: number;z?: number}[]=[b,a];

              Generic Type Inference

              Using different types for multiple arguments of type T is now an error, even with constraints involved:

              declarefunctionfoo<T>(x: T,y:T): T;varr=foo(1,"");// r used to be {}, now this is an error

              With constraints:

              interfaceAnimal{x}interfaceGiraffeextendsAnimal{y}interfaceElephantextendsAnimal{z}functionf<TextendsAnimal>(x: T,y: T): T{returnundefined;}varg: Giraffe;vare: Elephant;f(g,e);

              See #824 (comment) for explanation.

              Recommendations
              Specify an explicit type parameter if the mismatch was intentional:

              varr=foo<{}>(1,"");// Emulates 1.0 behaviorvarr=foo<string|number>(1,"");// Most usefulvarr=foo<any>(1,"");// Easiestf<Animal>(g,e);

              or rewrite the function definition to specify that mismatches are OK:

              declarefunctionfoo<T,U>(x: T,y:U): T|U;functionf<TextendsAnimal,UextendsAnimal>(x: T,y: U): T|U{returnundefined;}

              Generic Rest Parameters

              You cannot use hetergeneous argument types anymore:

              functionmakeArray<T>(...items: T[]): T[]{returnitems;}varr=makeArray(1,"");// used to return {}[], now an error

              Likewise for new Array(...)

              Recommendations
              Declare a back-compat signature if the 1.0 behavior was desired:

              functionmakeArray<T>(...items: T[]): T[];functionmakeArray(...items: {}[]): {}[];functionmakeArray<T>(...items: T[]): T[]{returnitems;}

              Overload Resolution with Type Argument Inference

              varf10: <T>(x: T,b: ()=>(a: T)=>void,y: T)=>T;varr9=f10('',()=>(a=>a.foo),1);// r9 was any, now this is an error

              Recommendations
              Manually specify a type parameter

              varr9=f10<any>('',()=>(a=>a.foo),1);

              Promises

              This used to not have an error:

              interfacePromise<T>{then<U>(success?: (value: T)=>Promise<U>,error?: (error: any)=>Promise<U>,progress?: (progress: any)=>void): Promise<U>;then<U>(success?: (value: T)=>Promise<U>,error?: (error: any)=>U,progress?: (progress: any)=>void): Promise<U>;then<U>(success?: (value: T)=>U,error?: (error: any)=>Promise<U>,progress?: (progress: any)=>void): Promise<U>;then<U>(success?: (value: T)=>U,error?: (error: any)=>U,progress?: (progress: any)=>void): Promise<U>;done<U>(success?: (value: T)=>any,error?: (error: any)=>any,progress?: (progress: any)=>void): void;}interfaceIPromise<T>{then<U>(success?: (value: T)=>IPromise<U>,error?: (error: any)=>IPromise<U>,progress?: (progress: any)=>void): IPromise<U>;then<U>(success?: (value: T)=>IPromise<U>,error?: (error: any)=>U,progress?: (progress: any)=>void): IPromise<U>;then<U>(success?: (value: T)=>U,error?: (error: any)=>IPromise<U>,progress?: (progress: any)=>void): IPromise<U>;then<U>(success?: (value: T)=>U,error?: (error: any)=>U,progress?: (progress: any)=>void): IPromise<U>;done? <U>(success?: (value: T)=>any,error?: (error: any)=>any,progress?: (progress: any)=>void): void;}declarefunctionf1(x: number): IPromise<number>;declarefunctionf2(x: number): Promise<number>;varp: Promise<number>;varr=p.then(f2,f1,f1).then(f1,f1,f1);// ^^// error TS2345: Argument of type '(x: number) => IPromise<number>' is not assignable to parameter of type '(value: IPromise<number>) => IPromise<number>'.

              Activity

              Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

              Metadata

              Metadata

              Assignees

              No one assigned

                Labels

                Breaking ChangeWould introduce errors in existing codeBy DesignDeprecated - use "Working as Intended" or "Design Limitation" instead

                Type

                No type

                Projects

                No projects

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions

                  , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
                  Skip to content

                  Breaking changes associated with Union Types #868

                  Description

                  @danquirk

                  This issue tracks the set of breaking changes that result from the change to union types #824 to implement the suggestion #805. The issues here will be formalized further once an official spec update is done, until then it will mostly serve as an easy reference for the type of coding patterns that have broken for various reasons.

                  Multiple Best Common Type Candidates

                  Given multiple viable candidates from a Best Common Type computation we now choose an item (depending on the compiler's implementation) rather than the first item.

                  vara: {x: number;y?: number};varb: {x: number;z?: number};// was { x: number; z?: number; }[]// now { x: number; y?: number; }[]varbs=[b,a];

                  This can happen in a variety of circumstances. A shared set of required properties and a disjoint set of other properties (optional or otherwise), empty types, compatible signature types (including generic and non-generic signatures when type parameters are stamped out with any).

                  Recommendation
                  Provide a type annotation if you need a specific type to be chosen

                  varbs: {x: number;y?: number;z?: number}[]=[b,a];

                  Generic Type Inference

                  Using different types for multiple arguments of type T is now an error, even with constraints involved:

                  declarefunctionfoo<T>(x: T,y:T): T;varr=foo(1,"");// r used to be {}, now this is an error

                  With constraints:

                  interfaceAnimal{x}interfaceGiraffeextendsAnimal{y}interfaceElephantextendsAnimal{z}functionf<TextendsAnimal>(x: T,y: T): T{returnundefined;}varg: Giraffe;vare: Elephant;f(g,e);

                  See #824 (comment) for explanation.

                  Recommendations
                  Specify an explicit type parameter if the mismatch was intentional:

                  varr=foo<{}>(1,"");// Emulates 1.0 behaviorvarr=foo<string|number>(1,"");// Most usefulvarr=foo<any>(1,"");// Easiestf<Animal>(g,e);

                  or rewrite the function definition to specify that mismatches are OK:

                  declarefunctionfoo<T,U>(x: T,y:U): T|U;functionf<TextendsAnimal,UextendsAnimal>(x: T,y: U): T|U{returnundefined;}

                  Generic Rest Parameters

                  You cannot use hetergeneous argument types anymore:

                  functionmakeArray<T>(...items: T[]): T[]{returnitems;}varr=makeArray(1,"");// used to return {}[], now an error

                  Likewise for new Array(...)

                  Recommendations
                  Declare a back-compat signature if the 1.0 behavior was desired:

                  functionmakeArray<T>(...items: T[]): T[];functionmakeArray(...items: {}[]): {}[];functionmakeArray<T>(...items: T[]): T[]{returnitems;}

                  Overload Resolution with Type Argument Inference

                  varf10: <T>(x: T,b: ()=>(a: T)=>void,y: T)=>T;varr9=f10('',()=>(a=>a.foo),1);// r9 was any, now this is an error

                  Recommendations
                  Manually specify a type parameter

                  varr9=f10<any>('',()=>(a=>a.foo),1);

                  Promises

                  This used to not have an error:

                  interfacePromise<T>{then<U>(success?: (value: T)=>Promise<U>,error?: (error: any)=>Promise<U>,progress?: (progress: any)=>void): Promise<U>;then<U>(success?: (value: T)=>Promise<U>,error?: (error: any)=>U,progress?: (progress: any)=>void): Promise<U>;then<U>(success?: (value: T)=>U,error?: (error: any)=>Promise<U>,progress?: (progress: any)=>void): Promise<U>;then<U>(success?: (value: T)=>U,error?: (error: any)=>U,progress?: (progress: any)=>void): Promise<U>;done<U>(success?: (value: T)=>any,error?: (error: any)=>any,progress?: (progress: any)=>void): void;}interfaceIPromise<T>{then<U>(success?: (value: T)=>IPromise<U>,error?: (error: any)=>IPromise<U>,progress?: (progress: any)=>void): IPromise<U>;then<U>(success?: (value: T)=>IPromise<U>,error?: (error: any)=>U,progress?: (progress: any)=>void): IPromise<U>;then<U>(success?: (value: T)=>U,error?: (error: any)=>IPromise<U>,progress?: (progress: any)=>void): IPromise<U>;then<U>(success?: (value: T)=>U,error?: (error: any)=>U,progress?: (progress: any)=>void): IPromise<U>;done? <U>(success?: (value: T)=>any,error?: (error: any)=>any,progress?: (progress: any)=>void): void;}declarefunctionf1(x: number): IPromise<number>;declarefunctionf2(x: number): Promise<number>;varp: Promise<number>;varr=p.then(f2,f1,f1).then(f1,f1,f1);// ^^// error TS2345: Argument of type '(x: number) => IPromise<number>' is not assignable to parameter of type '(value: IPromise<number>) => IPromise<number>'.

                  Activity

                  Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

                  Metadata

                  Metadata

                  Assignees

                  No one assigned

                    Labels

                    Breaking ChangeWould introduce errors in existing codeBy DesignDeprecated - use "Working as Intended" or "Design Limitation" instead

                    Type

                    No type

                    Projects

                    No projects

                      Relationships

                      None yet

                      Development

                      No branches or pull requests

                      Issue actions

                      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
                      Skip to content

                      Breaking changes associated with Union Types #868

                      Description

                      @danquirk

                      This issue tracks the set of breaking changes that result from the change to union types #824 to implement the suggestion #805. The issues here will be formalized further once an official spec update is done, until then it will mostly serve as an easy reference for the type of coding patterns that have broken for various reasons.

                      Multiple Best Common Type Candidates

                      Given multiple viable candidates from a Best Common Type computation we now choose an item (depending on the compiler's implementation) rather than the first item.

                      vara: {x: number;y?: number};varb: {x: number;z?: number};// was { x: number; z?: number; }[]// now { x: number; y?: number; }[]varbs=[b,a];

                      This can happen in a variety of circumstances. A shared set of required properties and a disjoint set of other properties (optional or otherwise), empty types, compatible signature types (including generic and non-generic signatures when type parameters are stamped out with any).

                      Recommendation
                      Provide a type annotation if you need a specific type to be chosen

                      varbs: {x: number;y?: number;z?: number}[]=[b,a];

                      Generic Type Inference

                      Using different types for multiple arguments of type T is now an error, even with constraints involved:

                      declarefunctionfoo<T>(x: T,y:T): T;varr=foo(1,"");// r used to be {}, now this is an error

                      With constraints:

                      interfaceAnimal{x}interfaceGiraffeextendsAnimal{y}interfaceElephantextendsAnimal{z}functionf<TextendsAnimal>(x: T,y: T): T{returnundefined;}varg: Giraffe;vare: Elephant;f(g,e);

                      See #824 (comment) for explanation.

                      Recommendations
                      Specify an explicit type parameter if the mismatch was intentional:

                      varr=foo<{}>(1,"");// Emulates 1.0 behaviorvarr=foo<string|number>(1,"");// Most usefulvarr=foo<any>(1,"");// Easiestf<Animal>(g,e);

                      or rewrite the function definition to specify that mismatches are OK:

                      declarefunctionfoo<T,U>(x: T,y:U): T|U;functionf<TextendsAnimal,UextendsAnimal>(x: T,y: U): T|U{returnundefined;}

                      Generic Rest Parameters

                      You cannot use hetergeneous argument types anymore:

                      functionmakeArray<T>(...items: T[]): T[]{returnitems;}varr=makeArray(1,"");// used to return {}[], now an error

                      Likewise for new Array(...)

                      Recommendations
                      Declare a back-compat signature if the 1.0 behavior was desired:

                      functionmakeArray<T>(...items: T[]): T[];functionmakeArray(...items: {}[]): {}[];functionmakeArray<T>(...items: T[]): T[]{returnitems;}

                      Overload Resolution with Type Argument Inference

                      varf10: <T>(x: T,b: ()=>(a: T)=>void,y: T)=>T;varr9=f10('',()=>(a=>a.foo),1);// r9 was any, now this is an error

                      Recommendations
                      Manually specify a type parameter

                      varr9=f10<any>('',()=>(a=>a.foo),1);

                      Promises

                      This used to not have an error:

                      interfacePromise<T>{then<U>(success?: (value: T)=>Promise<U>,error?: (error: any)=>Promise<U>,progress?: (progress: any)=>void): Promise<U>;then<U>(success?: (value: T)=>Promise<U>,error?: (error: any)=>U,progress?: (progress: any)=>void): Promise<U>;then<U>(success?: (value: T)=>U,error?: (error: any)=>Promise<U>,progress?: (progress: any)=>void): Promise<U>;then<U>(success?: (value: T)=>U,error?: (error: any)=>U,progress?: (progress: any)=>void): Promise<U>;done<U>(success?: (value: T)=>any,error?: (error: any)=>any,progress?: (progress: any)=>void): void;}interfaceIPromise<T>{then<U>(success?: (value: T)=>IPromise<U>,error?: (error: any)=>IPromise<U>,progress?: (progress: any)=>void): IPromise<U>;then<U>(success?: (value: T)=>IPromise<U>,error?: (error: any)=>U,progress?: (progress: any)=>void): IPromise<U>;then<U>(success?: (value: T)=>U,error?: (error: any)=>IPromise<U>,progress?: (progress: any)=>void): IPromise<U>;then<U>(success?: (value: T)=>U,error?: (error: any)=>U,progress?: (progress: any)=>void): IPromise<U>;done? <U>(success?: (value: T)=>any,error?: (error: any)=>any,progress?: (progress: any)=>void): void;}declarefunctionf1(x: number): IPromise<number>;declarefunctionf2(x: number): Promise<number>;varp: Promise<number>;varr=p.then(f2,f1,f1).then(f1,f1,f1);// ^^// error TS2345: Argument of type '(x: number) => IPromise<number>' is not assignable to parameter of type '(value: IPromise<number>) => IPromise<number>'.

                      Activity

                      Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

                      Metadata

                      Metadata

                      Assignees

                      No one assigned

                        Labels

                        Breaking ChangeWould introduce errors in existing codeBy DesignDeprecated - use "Working as Intended" or "Design Limitation" instead

                        Type

                        No type

                        Projects

                        No projects

                          Relationships

                          None yet

                          Development

                          No branches or pull requests

                          Issue actions

                          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
                          Skip to content

                          Breaking changes associated with Union Types #868

                          Description

                          @danquirk

                          This issue tracks the set of breaking changes that result from the change to union types #824 to implement the suggestion #805. The issues here will be formalized further once an official spec update is done, until then it will mostly serve as an easy reference for the type of coding patterns that have broken for various reasons.

                          Multiple Best Common Type Candidates

                          Given multiple viable candidates from a Best Common Type computation we now choose an item (depending on the compiler's implementation) rather than the first item.

                          vara: {x: number;y?: number};varb: {x: number;z?: number};// was { x: number; z?: number; }[]// now { x: number; y?: number; }[]varbs=[b,a];

                          This can happen in a variety of circumstances. A shared set of required properties and a disjoint set of other properties (optional or otherwise), empty types, compatible signature types (including generic and non-generic signatures when type parameters are stamped out with any).

                          Recommendation
                          Provide a type annotation if you need a specific type to be chosen

                          varbs: {x: number;y?: number;z?: number}[]=[b,a];

                          Generic Type Inference

                          Using different types for multiple arguments of type T is now an error, even with constraints involved:

                          declarefunctionfoo<T>(x: T,y:T): T;varr=foo(1,"");// r used to be {}, now this is an error

                          With constraints:

                          interfaceAnimal{x}interfaceGiraffeextendsAnimal{y}interfaceElephantextendsAnimal{z}functionf<TextendsAnimal>(x: T,y: T): T{returnundefined;}varg: Giraffe;vare: Elephant;f(g,e);

                          See #824 (comment) for explanation.

                          Recommendations
                          Specify an explicit type parameter if the mismatch was intentional:

                          varr=foo<{}>(1,"");// Emulates 1.0 behaviorvarr=foo<string|number>(1,"");// Most usefulvarr=foo<any>(1,"");// Easiestf<Animal>(g,e);

                          or rewrite the function definition to specify that mismatches are OK:

                          declarefunctionfoo<T,U>(x: T,y:U): T|U;functionf<TextendsAnimal,UextendsAnimal>(x: T,y: U): T|U{returnundefined;}

                          Generic Rest Parameters

                          You cannot use hetergeneous argument types anymore:

                          functionmakeArray<T>(...items: T[]): T[]{returnitems;}varr=makeArray(1,"");// used to return {}[], now an error

                          Likewise for new Array(...)

                          Recommendations
                          Declare a back-compat signature if the 1.0 behavior was desired:

                          functionmakeArray<T>(...items: T[]): T[];functionmakeArray(...items: {}[]): {}[];functionmakeArray<T>(...items: T[]): T[]{returnitems;}

                          Overload Resolution with Type Argument Inference

                          varf10: <T>(x: T,b: ()=>(a: T)=>void,y: T)=>T;varr9=f10('',()=>(a=>a.foo),1);// r9 was any, now this is an error

                          Recommendations
                          Manually specify a type parameter

                          varr9=f10<any>('',()=>(a=>a.foo),1);

                          Promises

                          This used to not have an error:

                          interfacePromise<T>{then<U>(success?: (value: T)=>Promise<U>,error?: (error: any)=>Promise<U>,progress?: (progress: any)=>void): Promise<U>;then<U>(success?: (value: T)=>Promise<U>,error?: (error: any)=>U,progress?: (progress: any)=>void): Promise<U>;then<U>(success?: (value: T)=>U,error?: (error: any)=>Promise<U>,progress?: (progress: any)=>void): Promise<U>;then<U>(success?: (value: T)=>U,error?: (error: any)=>U,progress?: (progress: any)=>void): Promise<U>;done<U>(success?: (value: T)=>any,error?: (error: any)=>any,progress?: (progress: any)=>void): void;}interfaceIPromise<T>{then<U>(success?: (value: T)=>IPromise<U>,error?: (error: any)=>IPromise<U>,progress?: (progress: any)=>void): IPromise<U>;then<U>(success?: (value: T)=>IPromise<U>,error?: (error: any)=>U,progress?: (progress: any)=>void): IPromise<U>;then<U>(success?: (value: T)=>U,error?: (error: any)=>IPromise<U>,progress?: (progress: any)=>void): IPromise<U>;then<U>(success?: (value: T)=>U,error?: (error: any)=>U,progress?: (progress: any)=>void): IPromise<U>;done? <U>(success?: (value: T)=>any,error?: (error: any)=>any,progress?: (progress: any)=>void): void;}declarefunctionf1(x: number): IPromise<number>;declarefunctionf2(x: number): Promise<number>;varp: Promise<number>;varr=p.then(f2,f1,f1).then(f1,f1,f1);// ^^// error TS2345: Argument of type '(x: number) => IPromise<number>' is not assignable to parameter of type '(value: IPromise<number>) => IPromise<number>'.

                          Activity

                          Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

                          Metadata

                          Metadata

                          Assignees

                          No one assigned

                            Labels

                            Breaking ChangeWould introduce errors in existing codeBy DesignDeprecated - use "Working as Intended" or "Design Limitation" instead

                            Type

                            No type

                            Projects

                            No projects

                              Relationships

                              None yet

                              Development

                              No branches or pull requests

                              Issue actions

                              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
                              Skip to content

                              Breaking changes associated with Union Types #868

                              Description

                              @danquirk

                              This issue tracks the set of breaking changes that result from the change to union types #824 to implement the suggestion #805. The issues here will be formalized further once an official spec update is done, until then it will mostly serve as an easy reference for the type of coding patterns that have broken for various reasons.

                              Multiple Best Common Type Candidates

                              Given multiple viable candidates from a Best Common Type computation we now choose an item (depending on the compiler's implementation) rather than the first item.

                              vara: {x: number;y?: number};varb: {x: number;z?: number};// was { x: number; z?: number; }[]// now { x: number; y?: number; }[]varbs=[b,a];

                              This can happen in a variety of circumstances. A shared set of required properties and a disjoint set of other properties (optional or otherwise), empty types, compatible signature types (including generic and non-generic signatures when type parameters are stamped out with any).

                              Recommendation
                              Provide a type annotation if you need a specific type to be chosen

                              varbs: {x: number;y?: number;z?: number}[]=[b,a];

                              Generic Type Inference

                              Using different types for multiple arguments of type T is now an error, even with constraints involved:

                              declarefunctionfoo<T>(x: T,y:T): T;varr=foo(1,"");// r used to be {}, now this is an error

                              With constraints:

                              interfaceAnimal{x}interfaceGiraffeextendsAnimal{y}interfaceElephantextendsAnimal{z}functionf<TextendsAnimal>(x: T,y: T): T{returnundefined;}varg: Giraffe;vare: Elephant;f(g,e);

                              See #824 (comment) for explanation.

                              Recommendations
                              Specify an explicit type parameter if the mismatch was intentional:

                              varr=foo<{}>(1,"");// Emulates 1.0 behaviorvarr=foo<string|number>(1,"");// Most usefulvarr=foo<any>(1,"");// Easiestf<Animal>(g,e);

                              or rewrite the function definition to specify that mismatches are OK:

                              declarefunctionfoo<T,U>(x: T,y:U): T|U;functionf<TextendsAnimal,UextendsAnimal>(x: T,y: U): T|U{returnundefined;}

                              Generic Rest Parameters

                              You cannot use hetergeneous argument types anymore:

                              functionmakeArray<T>(...items: T[]): T[]{returnitems;}varr=makeArray(1,"");// used to return {}[], now an error

                              Likewise for new Array(...)

                              Recommendations
                              Declare a back-compat signature if the 1.0 behavior was desired:

                              functionmakeArray<T>(...items: T[]): T[];functionmakeArray(...items: {}[]): {}[];functionmakeArray<T>(...items: T[]): T[]{returnitems;}

                              Overload Resolution with Type Argument Inference

                              varf10: <T>(x: T,b: ()=>(a: T)=>void,y: T)=>T;varr9=f10('',()=>(a=>a.foo),1);// r9 was any, now this is an error

                              Recommendations
                              Manually specify a type parameter

                              varr9=f10<any>('',()=>(a=>a.foo),1);

                              Promises

                              This used to not have an error:

                              interfacePromise<T>{then<U>(success?: (value: T)=>Promise<U>,error?: (error: any)=>Promise<U>,progress?: (progress: any)=>void): Promise<U>;then<U>(success?: (value: T)=>Promise<U>,error?: (error: any)=>U,progress?: (progress: any)=>void): Promise<U>;then<U>(success?: (value: T)=>U,error?: (error: any)=>Promise<U>,progress?: (progress: any)=>void): Promise<U>;then<U>(success?: (value: T)=>U,error?: (error: any)=>U,progress?: (progress: any)=>void): Promise<U>;done<U>(success?: (value: T)=>any,error?: (error: any)=>any,progress?: (progress: any)=>void): void;}interfaceIPromise<T>{then<U>(success?: (value: T)=>IPromise<U>,error?: (error: any)=>IPromise<U>,progress?: (progress: any)=>void): IPromise<U>;then<U>(success?: (value: T)=>IPromise<U>,error?: (error: any)=>U,progress?: (progress: any)=>void): IPromise<U>;then<U>(success?: (value: T)=>U,error?: (error: any)=>IPromise<U>,progress?: (progress: any)=>void): IPromise<U>;then<U>(success?: (value: T)=>U,error?: (error: any)=>U,progress?: (progress: any)=>void): IPromise<U>;done? <U>(success?: (value: T)=>any,error?: (error: any)=>any,progress?: (progress: any)=>void): void;}declarefunctionf1(x: number): IPromise<number>;declarefunctionf2(x: number): Promise<number>;varp: Promise<number>;varr=p.then(f2,f1,f1).then(f1,f1,f1);// ^^// error TS2345: Argument of type '(x: number) => IPromise<number>' is not assignable to parameter of type '(value: IPromise<number>) => IPromise<number>'.

                              Activity

                              Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

                              Metadata

                              Metadata

                              Assignees

                              No one assigned

                                Labels

                                Breaking ChangeWould introduce errors in existing codeBy DesignDeprecated - use "Working as Intended" or "Design Limitation" instead

                                Type

                                No type

                                Projects

                                No projects

                                  Relationships

                                  None yet

                                  Development

                                  No branches or pull requests

                                  Issue actions