Для данного именованного объекта типа 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 не позволяет присваивать объектам одинаковые типы? структурная типизация?