In TypeScript classes it's possible to declare types for properties, for example:
class className { property: string; };
How do declare the type of a property in an object literal?
I've tried the following code but it doesn't compile:
var obj = { property: string; };
I'm getting the following error:
The name 'string' does not exist in the current scope
Am I doing something wrong or is this a bug?
In TypeScript, object is the type of all non-primitive values (primitive values are undefined , null , booleans, numbers, bigints, strings). With this type, we can't access any properties of a value.
Built-in Type Definitions TypeScript includes declaration files for all of the standardized built-in APIs available in JavaScript runtimes. This includes things like methods and properties of built-in types like string or function , top-level names like Math and Object , and their associated types.
The type syntax for declaring a variable in TypeScript is to include a colon (:) after the variable name, followed by its type. Just as in JavaScript, we use the var keyword to declare a variable. Declare its type and value in one statement.
You're pretty close, you just need to replace the =
with a :
. You can use an object type literal (see spec section 3.5.3) or an interface. Using an object type literal is close to what you have:
var obj: { property: string; } = { property: "foo" };
But you can also use an interface
interface MyObjLayout { property: string; } var obj: MyObjLayout = { property: "foo" };
After many years of using const
and benefiting from more functional code, I would recommend against using the below in most cases. (When building objects, forcing the type system into a specific type instead of letting it infer types is often an indication that something is wrong).
Instead I would recommend using const
variables as much as possible and then compose the object as the final step:
const id = GetId(); const hasStarted = true; ... const hasFinished = false; ... return {hasStarted, hasFinished, id};
If you do actually need a type that you can be lazily initialized: Mark it is a nullable union type (null or Type). The type system will prevent you from using it without first ensuring it has a value.
In tsconfig.json
, make sure you enable strict null checks:
"strictNullChecks": true
Then use this pattern and allow the type system to protect you from accidental null/undefined access:
const state = { instance: null as null | ApiService, // OR // instance: undefined as undefined | ApiService, }; const useApi = () => { // If I try to use it here, the type system requires a safe way to access it // Simple lazy-initialization const api = state?.instance ?? (state.instance = new ApiService()); api.fun(); // Also here are some ways to only access it if it has value: // The 'right' way: Typescript 3.7 required state.instance?.fun(); // Or the old way: If you are stuck before Typescript 3.7 state.instance && state.instance.fun(); // Or the long winded way because the above just feels weird if (state.instance) { state.instance.fun(); } // Or the I came from C and can't check for nulls like they are booleans way if (state.instance != null) { state.instance.fun(); } // Or the I came from C and can't check for nulls like they are booleans // AND I was told to always use triple === in javascript even with null checks way if (state.instance !== null && state.instance !== undefined) { state.instance.fun(); } }; class ApiService { fun() { // Do something useful here } }
Use the as
operator for TSX.
var obj = { property: null as string };
A longer example:
var call = { hasStarted: null as boolean, hasFinished: null as boolean, id: null as number, };
Use the cast operator to make this succinct (by casting null to the desired type).
var obj = { property: <string> null };
A longer example:
var call = { hasStarted: <boolean> null, hasFinished: <boolean> null, id: <number> null, };
This is much better than having two parts (one to declare types, the second to declare defaults):
var callVerbose: { hasStarted: boolean; hasFinished: boolean; id: number; } = { hasStarted: null, hasFinished: null, id: null, };
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With