Типы и имена должны совпадать - PullRequest
0 голосов
/ 26 апреля 2018

Для данного именованного объекта типа t,

interface t {
    a: string,
    b: number,
    c: string
}

let obj:t = {
    a: "foo",
    b: 12,
    c: "bar"
}

ниже - функция, обрабатывающая этот именованный объект,

function keepWholeObject(obj_param: {x: string, y:number}){
    let {a, b}:{a: string, b: number} = obj_param;
    console.log(`In function - ${a}`);
    console.log(`In function - ${b}`);
}

, где

let {a, b}:{a: string, b: number} = obj_param; не работает.

Потому что типы и имена должны совпадать. Ошибка: Type '{ x: string; y: number; }' is not assignable to type '{ a: string; b: number; }'. Property 'a' is missing in type '{ x: string; y: number; }'


A ловушка из структурная типизация по сравнению с номинативной типизацией состоит в том, что два отдельно определенных типа предназначены для разных целей, но случайно содержат одинаковые свойства (например, оба составлены из пары целых чисел) , может считаться одним и тем же типом системой типов просто потому, что они имеют одинаковую структуру. Один из способов избежать этого - создать один алгебраический тип данных (составной тип) для каждого использования. взято из

Вот почему в моем объявлении функции выше я объявил параметры, используя составной тип, деструктурированный как obj_param: {a: string, b:number}, но не {a, b}: {a: string, b:number}, чтобы избежать дублирования идентификаторов. Побочные эффекты совпадения имен и типов.


Почему TypeScript не позволяет присваивать объектам одинаковые типы? структурная типизация?

1 Ответ

0 голосов
/ 26 апреля 2018

Редактировать 2

type Point = { x: number, y: string};
type Vector2 = { 0: number, 1: string}
let p :Point;
let v :Vector2 = p;

Точно так же здесь есть и два варианта.

  1. Сгенерировать ошибку, так как типы несовместимы.
  2. Преобразование значений в соответствующие поля, поэтому нам не нужно никаких дополнительных вещей.

Вариант 1 имеет наивысший приоритет. Как уже упоминалось @binDebug, именно поэтому этот язык был построен.

Редактировать

Когда машинопись преобразуется в js, она будет выглядеть как

function keepWholeObject(obj_param){
    let {a, b} = obj_param;
    console.log(`In function - ${a}`);
    console.log(`In function - ${b}`);
} 

Без информации о типах.

Предыдущий ответ

function keepWholeObject(obj_param: { a: string, b: number }) {
  let { a, b }: { a: string, b: number } = obj_param;
  console.log(`In function - ${a}`);
  console.log(`In function - ${b}`);
}
  1. obj_param: { a: string, b: number } будет работать не с x и y.
  2. Типы являются функцией времени компиляции и стираются во время выполнения.
  3. Уничтожение - это функция JavaScript. Подводя итог, деструктурирование javascript работает следующим образом.
...