Repository navigation
Comparison targets are reversed (regression) #31251
Description
Activity
falsandtru commented
on May 4, 2019 ContributorAuthorMore actionsNote that a regression test for #30118 is already added but another case, posted here and there, is not covered by it.
jack-williams commented
on May 4, 2019 CollaboratorMore actionsCan't reproduce on
3.5.0-dev- is this behaviour in a release branch or at some intermediate point?falsandtru commented
on May 4, 2019 ContributorAuthorMore actionsCan you try with 3.5.0-dev.20190504?
falsandtru commented
on May 6, 2019 ContributorAuthorMore actionsjack-williams commented
on May 6, 2019 CollaboratorMore actionsJust tried off master and I do get the error you link.
I presume you are running
strictFunctionTypes?This error looks correct to me [EDIT: for this specific example, but there may be something wrong for other examples. See next comment in thread]. The property
instancesis a set ofSupervisor<string, unknown, unknown>, therefore allowing the methodcallto accept arguments of typestringin thenameposition. Thethisinstance is generic in thenameparameter tocalland may be instantiated with something more specific like"a", so it's not safe to assignthistoSupervisor<string, unknown, unknown>.A smaller example:
declare let withString: Supervisor<string>; declare let withA: Supervisor<"a">; withA.call("a", 'param'); // ok withA.call("a string" as string, 'param'); // not ok withString = withA; // correctly an error, otherwise we could make an illegal call through the alias withString.call("a string" as string, 'param'); // no error
jack-williams commented
on May 6, 2019 CollaboratorMore actionsIf you change
callto be:public abstract call(name: ('' extends N ? undefined : never), param: P, timeout?: number): Promise<R>;
you still get the error, which is probably incorrect and due to an invariant variance calculation which has been turned on again for the conditional type extends type. Small repro:
interface A<T> { x: number extends T ? 1 : 1; } declare let a: A<number>; declare let b: A<3>; a = b; // error b = a; // error
Wesley Wigham (@weswigham) Is it worth using your new unmeasurable markers for this?
// Two conditional types 'T1 extends U1 ? X1 : Y1' and 'T2 extends U2 ? X2 : Y2' are related if // one of T1 and T2 is related to the other, U1 and U2 are identical types, X1 is related to X2, // and Y1 is related to Y2. const u1 = instantiateType((<ConditionalType>source).extendsType, reportUnmeasurableMarkers); const u2 = instantiateType((<ConditionalType>target).extendsType, reportUnmeasurableMarkers); if (isTypeIdenticalTo(u1, u2) && ...
falsandtru commented
on May 6, 2019 ContributorAuthorMore actionsI presume you are running strictFunctionTypes?
No: https://github.com/falsandtru/spica/blob/master/tsconfig.json
declare let withString: Supervisor;
declare let withA: Supervisor<"a">;
withA.call("a", 'param'); // ok
withA.call("a string" as string, 'param'); // not ok
withString = withA; // correctly an error, otherwise we could make an illegal call through the alias
withString.call("a string" as string, 'param'); // no errorTypeScript originally hasn't supported this problem as Arrays also have the same problem. Therefore type checking is wrong or wrongly too strict in this case. So the error message may be correct but TypeScript shouldn't check it.
interface A {
x: number extends T ? 1 : 1;
}declare let a: A;
declare let b: A<3>;a = b; // error
b = a; // errorDoes it also fix this issue?
jack-williams commented
on May 6, 2019 CollaboratorMore actionsYep a couple of things wrong in my comments. Corrections:
strictFunctionTypesis irrelevant here becausecallis a method.- Similarly, my example:
withString = withA; // correctly an error, otherwise we could make an illegal call through the alias
is not relevant because
callis a method. It would be an error ifcallwas an arrow function, but it's not and so should not error for your code.Does it also fix this issue?
The minor suggestion I posted does fix my small repro and your example - though I'm not sure if it's the correct thing to do overall.
Reacted by falsandtru- addedNeeds InvestigationThis issue needs a team member to investigate its status.This issue needs a team member to investigate its status.
on May 8, 2019 falsandtru commented
on May 11, 2019 ContributorAuthorMore actionsAnders Hejlsberg (@ahejlsberg) Take a look?
falsandtru commented
on Jul 27, 2019 ContributorAuthorMore actionsAnders Hejlsberg (@ahejlsberg) Can you also fix this regression?
Reacted by Dasa Paddock20 remaining items
The similar problem #30118 had been fixed, but appeared again.
TypeScript Version: 3.4.0-dev.20190504
Search Terms:
Code
Expected behavior:
pass
Actual behavior:
Playground Link:
Related Issues: