// 1. any e unknown
let stringVariable: string = 'string'
let anyVariable: any
let unknownVariable: unknown
anyVariable = stringVariable
unknownVariable = stringVariable
stringVariable = anyVariable
stringVariable = unknownVariable
// 2. `never`
let stringVariable: string = 'string'
let anyVariable: any
let neverVariable: never
neverVariable = stringVariable
neverVariable = anyVariable
anyVariable = neverVariable
stringVariable = neverVariable
// 3. `void`, opción 1
let undefinedVariable: undefined
let voidVariable: void
let unknownVariable: unknown
voidVariable = undefinedVariable
undefinedVariable = voidVariable
voidVariable = unknownVariable
// 4. `void`, opción 2
function fn(cb: () => void): void {
return cb()
}
fn(() => 'string')
type *A* = string extends unknown? true : false; // true
type *B* = unknown extends string? true : false; // false
let string: string = 'foo'
let any: any = string // ✅ ⬆️conversión ascendente
let unknown: unknown = string // ✅ ⬆️conversión ascendente
let any: any
let unknown: unknown
let stringA: string = any // ✅ ⬇️conversión descendente posible teniendo en cuenta las características de 'any'
let stringB: string = unknown // ❌ ⬇️conversión descendente
let any: any
let number: number = 5
let never: never = any // ❌ ⬇️conversión descendente
never = number // ❌ ⬇️conversión descendente
number = never // ✅ ⬆️conversión ascendente
function fnThatNeverReturns(): never {
throw 'La función no devuelve nada'
}
const number: number = fnThatNeverReturns() // ✅ ⬆️conversión ascendente
type Foo = {
name: string,
age: number
}
type Bar = {
name: number,
age: number
}
type Baz = Foo & Bar
const a: Baz = {age: 12, name:'foo'} // ❌ El tipo 'string' no puede asignarse al tipo 'never'.
type UserWithEmail = {name: string, email: string}
type UserWithoutEmail = {name: string}
type *A* = UserWithEmail extends UserWithoutEmail ? true : false // true ✅ conversión ascendente
const emptyObject: {} = {foo: 'bar'} // ✅ conversión ascendente
type *A* = undefined extends void ? true : false; // true
type *B* = void extends undefined ? true : false; // false
function fn(cb: () => void): void {
return cb()
}
fn(() => 'string')
function doSomething(this: void, value: string) {
this // void
}
function fn(obj: {name: string}) {}
fn({name: 'foo', key: 1}) // ❌ El objeto literal solo puede especificar propiedades conocidas, y la propiedad 'key' no existe en el tipo '{ name: string; }'
type UserWithEmail = {name: string, email: string}
type UserWithoutEmail = {name: string}
let userB: UserWithoutEmail = {name: 'foo', email: 'foo@gmail.com'} // ❌ El tipo { name: string; email: string; } no puede asignarse al tipo UserWithoutEmail.