Addressing CR feedback
This commit is contained in:
parent
37b5c74b93
commit
2876ba6a6c
5 changed files with 23 additions and 9 deletions
|
@ -4622,8 +4622,8 @@ module ts {
|
||||||
// Get the narrowed type of a given symbol at a given location
|
// Get the narrowed type of a given symbol at a given location
|
||||||
function getNarrowedTypeOfSymbol(symbol: Symbol, node: Node) {
|
function getNarrowedTypeOfSymbol(symbol: Symbol, node: Node) {
|
||||||
var type = getTypeOfSymbol(symbol);
|
var type = getTypeOfSymbol(symbol);
|
||||||
// Only narrow when symbol is variable of a structured type
|
// Only narrow when symbol is variable of an object, union, or type parameter type
|
||||||
if (node && (symbol.flags & SymbolFlags.Variable && type.flags & TypeFlags.Structured)) {
|
if (node && symbol.flags & SymbolFlags.Variable && type.flags & (TypeFlags.ObjectType | TypeFlags.Union | TypeFlags.TypeParameter)) {
|
||||||
loop: while (node.parent) {
|
loop: while (node.parent) {
|
||||||
var child = node;
|
var child = node;
|
||||||
node = node.parent;
|
node = node.parent;
|
||||||
|
@ -6587,12 +6587,12 @@ module ts {
|
||||||
return numberType;
|
return numberType;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return true if type is any, an object type, a type parameter, or a union type composed of only those kinds of types
|
// Return true if type an object type, a type parameter, or a union type composed of only those kinds of types
|
||||||
function isStructuredType(type: Type): boolean {
|
function isStructuredType(type: Type): boolean {
|
||||||
if (type.flags & TypeFlags.Union) {
|
if (type.flags & TypeFlags.Union) {
|
||||||
return !forEach((<UnionType>type).types, t => !isStructuredType(t));
|
return !forEach((<UnionType>type).types, t => !isStructuredType(t));
|
||||||
}
|
}
|
||||||
return (type.flags & TypeFlags.Structured) !== 0;
|
return (type.flags & (TypeFlags.ObjectType | TypeFlags.TypeParameter)) !== 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
function isConstEnumObjectType(type: Type): boolean {
|
function isConstEnumObjectType(type: Type): boolean {
|
||||||
|
|
|
@ -1240,7 +1240,6 @@ module ts {
|
||||||
StringLike = String | StringLiteral,
|
StringLike = String | StringLiteral,
|
||||||
NumberLike = Number | Enum,
|
NumberLike = Number | Enum,
|
||||||
ObjectType = Class | Interface | Reference | Tuple | Anonymous,
|
ObjectType = Class | Interface | Reference | Tuple | Anonymous,
|
||||||
Structured = ObjectType | Union | TypeParameter
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Properties common to all types
|
// Properties common to all types
|
||||||
|
|
|
@ -1,12 +1,18 @@
|
||||||
//// [typeGuardsWithAny.ts]
|
//// [typeGuardsWithAny.ts]
|
||||||
var x: any = { p: 0 };
|
var x: any = { p: 0 };
|
||||||
if (x instanceof Object) {
|
if (x instanceof Object) {
|
||||||
x.p; // No error, type any is not narrowed
|
x.p; // No error, type any unaffected by type guard
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
x.p; // No error, type any unaffected by type guard
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//// [typeGuardsWithAny.js]
|
//// [typeGuardsWithAny.js]
|
||||||
var x = { p: 0 };
|
var x = { p: 0 };
|
||||||
if (x instanceof Object) {
|
if (x instanceof Object) {
|
||||||
x.p; // No error, type any is not narrowed
|
x.p; // No error, type any unaffected by type guard
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
x.p; // No error, type any unaffected by type guard
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,13 @@ if (x instanceof Object) {
|
||||||
>x : any
|
>x : any
|
||||||
>Object : ObjectConstructor
|
>Object : ObjectConstructor
|
||||||
|
|
||||||
x.p; // No error, type any is not narrowed
|
x.p; // No error, type any unaffected by type guard
|
||||||
|
>x.p : any
|
||||||
|
>x : any
|
||||||
|
>p : any
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
x.p; // No error, type any unaffected by type guard
|
||||||
>x.p : any
|
>x.p : any
|
||||||
>x : any
|
>x : any
|
||||||
>p : any
|
>p : any
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
var x: any = { p: 0 };
|
var x: any = { p: 0 };
|
||||||
if (x instanceof Object) {
|
if (x instanceof Object) {
|
||||||
x.p; // No error, type any is not narrowed
|
x.p; // No error, type any unaffected by type guard
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
x.p; // No error, type any unaffected by type guard
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue