Lógicamente también se pueden tipar todas las propiedades de los objetos en Typescript, misma sintaxis que ya conoces, con los dos puntos:

let user: {
  name: string,
  address: string,
  age: number
};

Tipar los objetos así no se suele hacer mucho porque existe una forma de dar nombres a los tipos para poder reutilizarlos en más sitios, los Type alias en Typescript, además también puedes usar las Interfaces en Typescript para declarar las entidades de tu lógica de negocio una vez y así usarlas en todo el proyecto.

Puedes usar este mismo sistema para el Tipado de funciones en Typescript, en caso de que quieras tipar cada propiedad del objeto que te pasan como parámetro:

function validateUser({ name: string, address: string, age: number}): boolean {
  return true;
}

Propiedades opcionales

Cuando creas un tipo, Typescript te va a exigir que el objeto que usas tenga todas las propiedades indicadas en el tipo. La ventaja de las propiedades opcionales es que puedes tener propiedades que no siempre sean requeridas, y esto se consigue con el símbolo de interrogación, es decir:

let user: {
  name: string,
  surname: string,
  address?: string,
  age: number,
};

Con el tipado de arriba, puedes tener objetos user con las propiedades name, surname y age y de forma opcional address.

Un consejo que se suele decir es que si tienes muchos objetos o tipos con propiedades opcionales, puede ser un síntoma de que necesites crear nuevos tipos que cubran esos casos y no un tipado muy general con muchas propiedades opcionales.

¿Y qué pasa si en lugar de crear parámetros opcionales hacemos esto? ¿no sería lo mismo?

let user: {
  name: string,
  surname: string,
  address: string | undefined, 
  age: number,
};

La realidad es que NO. Haciendo esto, Typescript te va a decir que tienes que crear el objeto con la propiedad address, es decir, tendrías que crear el objeto así, algo muy extraño:

user = {
	name: "Jhon",
	surname: "Doe",
	age: 28,
	address: undefined
}