opened
gcnew
username_0
**TypeScript Version:**  nightly (2.6.0-dev.20170829)

**Code**
```ts
type Point = { x: number, y: number }
type Mapped = Record<'x'|'y', number>
type IndexSignature = { [x: string]: never }

// All of the following have type: `() => Object`
type Test1 = Point['valueOf']
type Test2 = Mapped['valueOf'] 
type Test3 = IndexSignature['valueOf']
```

**Expected behavior:**
`Test1`, `Test2` and `Test3` should all be errors.

User provided types should be considered "exact". No properties should be inherited from `Object`. The current behaviour is of little use, it's quite confusing and really gets in the way of type level programming.
Global object properties should not surface on type level indexing
issue
created
gcnew
username_0
The magic `Object` keys are not present in `keyof` expressions, creating non-uniform behaviour:

```ts
type ValueOf<T, K extends keyof T> = T[K]
type Test4 = ValueOf<1, 'constructor'> // error
type Test5 = 1['constructor']          // OK 
```
comment
created
olegdunkan
username_1
https://github.com/Microsoft/TypeScript/issues/16578#issuecomment-309082083
comment
created
mhegazy
username_2
It is consistent with other uses of indexing.. e.g. indexing with numbers.. `keyof T` will return you only string, public, and own properties. I would argue that this is exactelly what you want.. you do not want `toString` to start showing up in all `keyof T`... that would be too verbose, and would be a breaking change..

On the flip side, not having it in `keyof T` does not change the fact that `toString` exists on all objects.. this is in a sense similar to indexing with numbers.
comment