如何在Typescript中使用ramda mergeRight并遵守接口定义

问题描述 投票:0回答:2

我正在尝试复制对象并使用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在编译时检测到此问题

node.js typescript ramda.js
2个回答
1
投票

要过滤掉不属于用户的键,请使用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>

0
投票

[似乎只是将匿名对象强制转换为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)
© www.soinside.com 2019 - 2024. All rights reserved.