gpt4 book ai didi

typescript - 如何理解 "Property ' name' is private in type 'User' "in typescript

转载 作者:行者123 更新时间:2023-12-05 05:03:14 25 4
gpt4 key购买 nike

我定义了一个 User 类,它有一个私有(private)字段:

class User {
private name: string = 'name'
hello(): void {

}
}

一个函数使用User类型:

function testUser(user: User) {
}

我不想创建 User 的实例,而是想使用一个对象来模拟它:

testUser({
name: 'new-name',
hello: () => {}
})

但是它有一个编译错误:

Argument of type '{ name: string; hello: () => void; }' is not assignable to parameter of type 'User'.
Property 'name' is private in type 'User' but not in type '{ name: string; hello: () => void; }'.(2345)

我听不懂:

  1. nameUser 类中是私有(private)的,为什么我们必须在我的模拟对象中提供它?
  2. 是否可以在模拟对象中提供一个私有(private)“名称”,或者找到一种不提供它而不会出现编译错误的方法?

Living demo in playground

最佳答案

在尝试将对象字面量分配给需要类的位置时,私有(private)字段有点问题。 Typescript 的立场是,由于私有(private)字段是只有声明类才能修改的东西,所以它不应该是可别名的。

您只能通过类型断言来解决这个问题。您可以创建一个创建类模拟的函数,方法是仅接受类的公共(public)字段并在内部进行类型断言以确保类型断言不会隐藏其他错误。只选择公共(public)字段的方法是通过 Pick<T, keyof T> 传递类型.自 keyof T只公开你最终删除私有(private)属性的公共(public)属性:


function mock<T>(o: Pick<T, keyof T>): T {
return o;
}

testUser(mock<User>({
hello: () => {

}
}))

Playground Link

关于typescript - 如何理解 "Property ' name' is private in type 'User' "in typescript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61798914/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com