提问人:Daryl 提问时间:1/3/2023 最后编辑:Cody Gray - on strikeDaryl 更新时间:1/3/2023 访问量:65
在 Typescript 中动态分配给对象文字
Assigning to an object literal dynamically in Typescript
问:
我已经在这里呆了几个小时,无法确定为什么我会得到 此打字稿错误。
我无法显示实际代码,但我已将问题简化为 示例代码如下:
abstract class CustomerType {
protected abstract customerInfo?: IUserInfo;
}
enum CustomerGroup {
FirstTimer = "first timer",
Subscriber = "subscriber"
}
interface IUserInfo {
group?: CustomerGroup;
firstClassMember?: boolean;
rewardsMember?: boolean;
}
abstract class CustomerType {
protected abstract customerInfo?: IUserInfo;
}
class Default extends CustomerType {
protected customerInfo: IUserInfo = {};
constructor(){
super();
}
get _customerInfo(){
return this.customerInfo ?? {}
}
set _customerInfo(customerInput: IUserInfo){
let input: keyof IUserInfo;
for(input in customerInput){
if(customerInput[input] === undefined) continue;
this.customerInfo = customerInput[input];
}
}
}
这是 Typescript 错误:
键入 'boolean |客户组 |undefined“不能分配给类型 “IUserInfo”。类型“undefined”不能分配给类型 “IUserInfo”。(2322)
打字稿无法推断出不是 undefined,尽管在错误上方进行了检查。
customerInput[input]
以下是代码笔的链接:https://codepen.io/darylshy/pen/YzjWBoG?editors=0011
答:
1赞
geoffrey
1/3/2023
#1
正确的代码应该是:
set _customerInfo(customerInput: IUserInfo){
let input: keyof IUserInfo;
for(input in customerInput){
if(customerInput[input] === undefined) continue;
this.customerInfo[input] = customerInput[input];
}
}
老实说,乍一看不知道为什么 TS 会抱怨。
无论如何,这样写会更好:
set _customerInfo(customerInput: IUserInfo){
Object.assign(this.customerInfo, customerInput)
}
您的循环没有多大意义:您正在用单个值覆盖 ,这是一个值的集合。那是你的错误。this.customerInfo
我还想补充一点,如果您不明白 TS 告诉您的内容,您可以随时尝试运行代码并检查返回值。无论如何,你都应该编写测试,为什么不在编写代码时编写它们呢?它会让你更快地摆脱困境。
例如,如果您编写了以下测试
const a = new Default();
a._customerInfo = { rewardsMember: true };
t.deepEqual(a._customerInfo, { rewardsMember: true })
测试运行程序会告诉你,而不是a._customerInfo
true
{ rewardsMember: true }
评论