typescript - 打字稿:输入对象具有接口键的子集
问题描述
我希望能够指定函数的输入对象应该只包含现有接口中存在的键(它不需要具有所有键)。
interface Group {
name: string
}
interface Person {
id: number
name: string
email: string
age: number
}
interface AddedProperties {
groups: Group[]
}
function createPerson<D extends object>( // <-- Should convey, D is an object with some keys of Person
personData: D
): D & AddedProperties {
return Object.assign({}, personData, { groups: [] })
}
interface NameAndAge {
name: string
age: number
}
// Valid: Should be valid
const person: NameAndAge = createPerson({ name: "bob", age: 5 })
// Valid: Should be invalid as 'personality' doesn't exist on Person
const person2 = createPerson({ name: "bob", age: 5, personality: "cheerful" })
这在打字稿中可能吗?
解决方案
一个简单的方法是使用Partial<>
:
function createPerson(
personData: Partial<Person>
): Partial<Person> & AddedProperties {
return { ...personData, groups: [] };
}
Partial
接受一个类型并使其所有成员都是可选的,因此允许您指定该类型的任何属性子集。
这种类型的缺点是返回的类型不知道你输入了什么:
createPerson({name: "Bob", age: 5}); // OK
createPerson({name: "Bob", gender: "male"}); // Type error
createPerson({name: "Bob"}).name; // OK
createPerson({name: "Bob"}).age; // OK :-(
如果您也想避免这种情况,请查看我的其他答案。
推荐阅读
- php - Intervention\Image\Exception\NotWritableException:无法将图像数据写入路径
- android-studio - 如何在 Kotlin 中制作两个动画的序列?
- javascript - Mongoose Put 使用 req.body。填充一些字段或空字符串其他
- algorithm - 在约束下最大化子集选择
- bash - 将文件从子目录批量复制到新文件夹?
- angular - 使用角度8删除表中的动态行
- python - Python Flask 应用程序无法解析 XML 请求数据
- sql - PostgreSQL string_agg,未找到值时的默认值
- android - Glide Image 没有显示也得到 SSLHandshakeException
- ios - Swift 5.1 运行时如何与旧版本的 iOS 配合使用?