Issue title: Variable in for/in loop over T is no longer "keyof T"
 Issue body: **TypeScript Version:** 2.9.2

**Code**

```ts
export type Enum<T> = {
  [key in keyof T]: string|number;
}&{[value: number]: string | undefined};


export function getKeyValuePairs<T>(anEnum: Enum<T>): Array<[keyof T, number]> {
  const result: Array<[keyof T, number]> = [];
  for (const key in anEnum) {
    if (anEnum.hasOwnProperty(key)) {
      const value = anEnum[key];
      if (typeof value === 'number') {
        result.push([key, value]);  // Argument of type '[string, never]' is not assignable to parameter of type '[keyof T, number]'.
      }
    }
  }
  return result;
}
```

**Expected behavior:**

Should infer that `key`'s type is `keyof T` (this is how TS2.8 behaved).

**Actual behavior:**

Infers `key` to be string.

**Playground Link:**

http://www.typescriptlang.org/play/#src=export%20type%20Enum%3CT%3E%20%3D%20%7B%0A%20%20%5Bkey%20in%20keyof%20T%5D%3A%20string%7Cnumber%3B%0A%7D%26%7B%5Bvalue%3A%20number%5D%3A%20string%20%7C%20undefined%7D%3B%0A%0A%0Aexport%20function%20getKeyValuePairs%3CT%3E(anEnum%3A%20Enum%3CT%3E)%3A%20Array%3C%5Bkeyof%20T%2C%20number%5D%3E%20%7B%0A%20%20const%20result%3A%20Array%3C%5Bkeyof%20T%2C%20number%5D%3E%20%3D%20%5B%5D%3B%0A%20%20for%20(const%20key%20in%20anEnum)%20%7B%0A%20%20%20%20if%20(anEnum.hasOwnProperty(key))%20%7B%0A%20%20%20%20%20%20const%20value%20%3D%20anEnum%5Bkey%5D%3B%0A%20%20%20%20%20%20if%20(typeof%20value%20%3D%3D%3D%20'number')%20%7B%0A%20%20%20%20%20%20%20%20result.push(%5Bkey%2C%20value%5D)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20return%20result%3B%0A%7D%0A
 Comments: 
 Comment 0: @DanielRosenwasser was this intentional?
 Comment 1: It is `Extract<keyof T, string>` with a conversion of `number` to `string` to model the run time behavior for numeric keys. The issue is the intersection in `Enum<T>` definition that makes the `keyof Enum<T>` includes `number`, so the type of `key` becomes `Extract<string | keyof T, string>`, since `string | keyof T` is just `string`, it resolves to `string`.
{'source': 'GithubIssues', 'repo_name_with_owner': 'Microsoft/TypeScript', 'issue_id': 335182631, 'repo_stars': 50182.0}