I want to create a type for an object with string
keys and arbitrary values. Thus, my desired type (let's call it Obj
) should cause a type error for the following obj
object because its key is of type number
:
const obj: Obj = {
1: "foo" // I'd expect a TS error here because the key 1 is of type `number` and not `string`
};
However, all of my attempts don't cause any TS error: Here are my three attempts:
Record
type (which implicitly uses the in
operator):type Obj = Record<'1', any>;
const obj: Obj = {
1: "foo" // TS error expected! ❌
};
Record
type):type Obj = { [key: string]: any };
const obj: Obj = {
1: "foo" // TS error expected! ❌
};
Record
type with key remapping via as
: type MyRecord<K extends string, T> = {
[P in K as string]: T;
};
type Obj = MyRecord<string, any>;
const obj: Obj = {
1: "foo" // TS error expected! ❌
};
'1'
does not enforce the key to be '1'
, but allows the number 1
:type Obj = Record<'1', any>;
const obj: Obj = {
1: "foo" // TS error expected! ❌
};
Is it in general possible, or is it due to some property of a JavaScript object that it's not possible?
The 1
is coerced to a string
( "1"
) when defining an object literal. You cannot define an object with number
keys:
const obj = { prop: 'value', 1: 'another value', }; for (const key in obj) { console.log(key, typeof key); }
By thekeyof
page of TypeScript doc
JavaScript object keys are always coerced to a string, so obj[0] is always the same as obj["0"]
So in fact {1: "foo"}
is just as same as {"1": "foo"}
.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.