Determinação do tipo de objeto ao criar um literal em TypeScript
Olá a todos! Comecei a estudar TypeScript recentemente e me deparei com um problema que me parece estranho. Quando crio um objeto usando um literal, quero especificar explicitamente seu tipo, mas não entendo como fazer isso corretamente.
Aqui está um exemplo: tenho uma interface `User` e quero criar um objeto `user` com esse tipo. Tentei várias maneiras, mas não tenho certeza de qual é a correta e qual é a diferença.
```typescript
interface User {
name: string;
age: number;
}
// Maneira 1: anotação de tipo após a declaração
const user1: User = {
name: 'Alexey',
age: 30
};
// Maneira 2: type assertion
const user2 = {
name: 'Maria',
age: 25
} as User;
// Maneira 3: sem tipo
const user3 = {
name: 'Ivan',
age: 35
};
```
Perguntas:
1. Qual é a diferença entre essas abordagens?
2. Qual delas é preferível?
3. Por que o TypeScript em alguns casos permite adicionar propriedades extras, mas em outros não?
Fico especialmente confuso com a situação em que quero passar um objeto para uma função, que...