TypeScript делает то, что должен делать. В вашем случае вы создаете новый объект tmp
с новым типом, который имеет 3 поля, а именно:
interface State {
fieldA: number,
fieldB: string
}
interface Tmp {
fieldA: string;
fieldB: string;
feildB: string;
}
Другими словами, оператор распространения выполняет следующую операцию:
interface Obj {
[key: string]: any;
}
const spread = (...objects: Obj[]) => {
const merged: Obj = {};
objects.forEach(obj => {
Object.keys(obj).forEach(k => merged[k] = obj[k]);
});
return merged;
}
Оператор распространения создает новый тип объекта для вас;если вы хотите вывести тип, то вы должны сделать:
// this now throws an error
const tmp: State = { ...state, feildB: action.payload };