类型和名称应匹配

时间:2018-04-26 16:42:14

标签: javascript typescript ecmascript-6 strong-typing

对于类型为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不允许分配具有相同类型的对象?结构打字?

1 个答案:

答案 0 :(得分:0)

修改2

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

同样,这里也有两种选择。

  1. 因类型不兼容而引发错误。
  2. 将值转换为适当的字段,因此我们不需要额外的内容。
  3. 选项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 }不适用于xy
    2. 类型是编译时功能,在运行时被删除。
    3. 解构是一个javascript功能。总结javascript解构就是这样的。