为什么即使接口中存在不需要的属性,打字稿也不会抛出错误?

时间:2017-04-17 02:23:59

标签: typescript typescript2.0

考虑以下代码块

interface Store {
    loading: boolean;
}

interface StoreMethod {
    (s: Store): Store;
}

export const createStore: StoreMethod = (store) => {
    return { ...store, working: false };
}


export const loadStore: StoreMethod = (store) => {
    return { loading: true, working: false };
}

我希望typescript会抛出错误,因为在返回对象中应该是Store,它没有属性working。我错过了什么吗?

您可以查看游乐场here中的代码。

1 个答案:

答案 0 :(得分:3)

你需要理解你的代码转换你的代码到没有接口概念的普通javascript。

在打字稿类型中AB类型兼容,如果A具有B所做的所有属性但是A不必具有确切的属性B具有A 至少的属性数量具有B所做的属性,即{{1可以包含A中不存在的其他属性。所以这个功能

B

返回的对象显然有一个名为export const loadStore: StoreMethod = (store) => { return { loading: true, working: false }; } 的属性,它满足契约你的loading强加,因此返回的对象被认为与Store兼容,如果从返回的对象中删除Store属性,typescript会抱怨。

typescript中的接口是一个设计工件,它在运行时不存在。