Closed
Description
Adding --strictInitialization
new option is helpful to clear behaviors of Control flow analysis.
Problem
CFA is not clear when declaration type and initialization type are not a same type.
class A<T> {
a: T;
}
class B<T> {
b: T;
}
function f() {
var o: A<void> | B<void> = new B<void>();
if (o instanceof A) return o; // B<void> & A<any>, intended type is A<void>
// But this operation is a mistake, should be removed.
}
related: #9859
Solution
Disallow initialization by different type.
var o1: A<void> | B<void> = new B<void>(); // error
var o2: A<void> | B<void> = <A<void> | B<void>>new B<void>(); // ok
var o3: A<void> | B<void>;
o3 = new B<void>(); // ok
o3 = new A<void>(); // ok
Metadata
Metadata
Assignees
Type
Projects
Milestone
Relationships
Development
No branches or pull requests
Activity
yortus commentedon Jul 22, 2016
If assignment at the point of declaration was an error, but the same assignment on the line after the declaration was ok, wouldn't that also be a confusing/unclear behaviour?
falsandtru commentedon Jul 22, 2016
It means
Another,
yortus commentedon Jul 22, 2016
This currently compiles fine. Are you suggesting it should be an error? If so, how else could you declare a default value for a parameter that had a union type?
falsandtru commentedon Jul 22, 2016
It is a correct case. Updated that example.
yortus commentedon Jul 22, 2016
So the last line in this example would be an error under this suggestion?
falsandtru commentedon Jul 22, 2016
Yes, it needs an assertions. You shouldn't modify variables under this suggestion, and should use
const
instead oflet
.yortus commentedon Jul 22, 2016
This doesn't appear consistent with your original suggestion, which shows an example of a
let
variable being modified from one type to another (o3
), and doesn't use anyconst
variables.Bear in mind that
const
variables must have initializers, and your suggestion here is to make it an error to use initializers on union-typed variables.I'd say it's unclear at best what problem this is solving and what kind of code you are aiming to encourage here. Perhaps you could revise the suggestion to show the kind of use of
const
variables that you are proposing?DanielRosenwasser commentedon Jul 22, 2016
I really can't come up with a practical case for where this is desirable. I don't know of any situations where I locally want to tell the type system that I don't want it to know the actual type at a given location.
The best thing I can imagine is when you're just trying to experiment with code to see what the apparent members are of a complex type, but in those cases, you can just use the
declare
keyword to make your declarations ambient.