对于类型为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; }'
结构类型与主格打字的陷阱是两个单独定义的类型,用于不同的目的,但意外地保持相同的属性(例如,两者都由一对整数),类型系统可以认为是相同的类型,只是因为它们碰巧具有相同的结构。可以避免的一种方法是为每次使用创建一个代数数据类型(复合类型)。 taken from
这就是为什么在上面的函数声明中,我使用复合类型解析参数为obj_param: {a: string, b:number}
而不是{a, b}: {a: string, b:number}
来避免重复标识符。匹配名称和类型的副作用。
为什么TypeScript不允许分配具有相同类型的对象?结构打字?
答案 0 :(得分:0)
修改2
type Point = { x: number, y: string};
type Vector2 = { 0: number, 1: string}
let p :Point;
let v :Vector2 = p;
同样,这里也有两种选择。
选项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}`);
}
obj_param: { a: string, b: number }
不适用于x
和y
。