【发布时间】:2018-04-11 13:39:19
【问题描述】:
鉴于 Typescript 2.5.3 中的这些类型...
type Data<T> = {
[K in keyof T]?: T[K]
}
interface Merge {
body: {
isMerged: boolean
}
}
interface Args {
one: number
two: number
}
为什么这个函数会编译失败:
function merge<T>(data: Data<T>): Merge & { body: Data<T> } {
const merged = {
body: {
isMerged: true
}
}
// Written this way to guarantee { body: isMerged } remains intact
merged.body = Object.assign({}, data, merged.body);
return merged;
}
然而这个电话……
const m = merge<Args>({
one: 1,
two: 2,
});
...正确推断返回的数据?
编辑:
我意识到将返回类型显式转换为:
return <Merge & { body: Data<T> }> merged;
... 抑制错误,但我的问题是为什么 Typescript 不能在以下情况下推断类型:
- 它知道函数签名中的返回类型
- 可以看到body中的
data没有任何变化
编辑 2 和结论/答案:
根据 Titian Cernicova-Dragomir 的回答,TL;DR 似乎是这样的:最初定义的类型是分配的类型。 类型不会变形。
我期待 Typescript 知道向一个类型添加额外的键将使其最终满足返回类型接口,但似乎最初定义的类型是坚持的类型。
因此,函数应该是:
function merge<T>(data: Data<T>): Merge & { body: Data<T> } {
const merged ={
body : Object.assign({}, data, {
isMerged: true
})
};
return merged;
}
即merged 在一个表达式中定义,而不是添加到多个表达式中。
【问题讨论】:
标签: typescript types