我正在尝试复制对象并使用Rambda的mergeRight
函数更改属性。问题是它允许我合并接口定义中不存在的属性。
import {mergeRight} from "ramda";
export interface User {
readonly userId: string
readonly username: string
}
const user: User = {
userId: "12345",
username: "SomeUser"
}
//I want this to be a compile time error, because "something" is not a property of User interface
const updatedUser: User = mergeRight(user, {something: "3"})
是否有任何方法可以确保要合并的属性是User
类型的一部分,而不必指定整个新的User对象(因此无法利用mergeRight的优势)?这将防止简单的错字引起难以调试的运行时错误。
理想情况下,我希望Typescript在编译时检测到此问题
要过滤掉不属于用户的键,请使用R.pick从新对象中仅提取User
中存在的键。
这只会影响对象的根级别,而不会造成更深的不匹配。
const { pick, keys, mergeDeepRight } = R
const user = {
userId: "12345",
username: "SomeUser"
}
const getUserKeys = pick(keys(user))
//I want this to be an error, because "something" is not a property of User interface
const updatedUser = mergeDeepRight(user, getUserKeys({
something: "3"
}))
console.log(updatedUser)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js"></script>
[似乎只是将匿名对象强制转换为User会给出我想要的错误。对于我的用例来说,这已经足够了。
//This causes a compile time error
const updatedUser: User = mergeRight(user, {something: "3"} as User)
//This does not
const updatedUser2: User = mergeRight(user, {userId: "3"} as User)