为什么这段ts代码不报错

function extend<T, U>(first: T, second: U): T & U {
    let result = <T & U>{};
    for (let id in first) {
        result[id] = (<any>first)[id];
    }
    for (let id in second) {
        if (!result.hasOwnProperty(id)) {
            (<any>result)[id] = (<any>second)[id];
        }
    }
    return result;
}

为什么上面的代码不报错,重点是下面这一句:

result[id] = (<any>first)[id];

result不一定具有id属性

阅读 4.2k
2 个回答

id的类型是keyof T, 类型T & U中有这个属性.

如果单纯回答你 result[id] = (<any>first)[id]; 问题的话,那分两块:

any 类型相当于 var,这样你就懂了;那问题是,为什么需要这样?这是因为ts是一个强类型,换句话说,任何一个变量都必须有一个相应的类型,否则 ts 编译器会报错。

而另一块,必须结合上下文看:

for (let id in first) {
    result[id] = (<any>first)[id];
}

问题的关键是 for...in,其意就是遍历 first 对象属性,所以 id 代表着是一个具体的属性名,故而:

result[id] = (<any>first)[id];

当然是合情合理的。

PS:我不建立用有争议性的变量名,哪怕你把 for (let id in first) 换成 for (let key in first) 也强很多。

happy coding!

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进