Is there any way to target the plain JavaScript object type in TypeScript?
Tested in TypeScript 3.7.2:
For a flat plain object, you can do:
type Primitive =
| bigint
| boolean
| null
| number
| string
| symbol
| undefined;
type PlainObject = Record<string, Primitive>;
class MyClass {
//
}
const obj1: PlainObject = { a: 1 }; // Works
const obj2: PlainObject = new MyClass(); // Error
For a nested plain object:
type Primitive =
| bigint
| boolean
| null
| number
| string
| symbol
| undefined;
type JSONValue = Primitive | JSONObject | JSONArray;
interface JSONObject {
[key: string]: JSONValue;
}
interface JSONArray extends Array<JSONValue> { }
const obj3: JSONObject = { a: 1 }; // Works
const obj4: JSONObject = new MyClass(); // Error
const obj5: JSONObject = { a: { b: 1 } }; // Works
const obj6: JSONObject = { a: { b: { c: 1 } } }; // Works
const obj7: JSONObject = { a: { b: { c: { d: 1 } } } }; // Works
Code is an adaptation from https://github.com/microsoft/TypeScript/issues/3496#issuecomment-128553540
In my code I have something similiar to what you're asking:
export type PlainObject = { [name: string]: any }
export type PlainObjectOf<T> = { [name: string]: T }
And I also have a type guard for that:
export function isPlainObject(obj: any): obj is PlainObject {
return obj && obj.constructor === Object || false;
}
Edit
Ok, I understand what you're looking for, but unfortunately that is not possible.
If i understand you correctly then this is what you're after:
type PlainObject = {
constructor: ObjectConstructor;
[name: string]: any
}
The problem is that in 'lib.d.ts' Object is defined like so:
interface Object {
/** The initial value of Object.prototype.constructor is the standard built-in Object constructor. */
constructor: Function;
...
}
And then this:
let o: PlainObject = { key: "value" };
Results with an error:
Type '{ key: string; }' is not assignable to type 'PlainObject'.
Types of property 'constructor' are incompatible.
Type 'Function' is not assignable to type 'ObjectConstructor'.
Property 'getPrototypeOf' is missing in type 'Function'.