在 Typescript 中动态分配给对象文字

Assigning to an object literal dynamically in Typescript

提问人:Daryl 提问时间:1/3/2023 最后编辑:Cody Gray - on strikeDaryl 更新时间:1/3/2023 访问量:65

问:

我已经在这里呆了几个小时,无法确定为什么我会得到 此打字稿错误。

我无法显示实际代码,但我已将问题简化为 示例代码如下:

    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]

下面是 typescript playground 的链接: https://www.typescriptlang.org/play?#code/FAUwdgrgtgBAwhAzgFwPZRAJwOKdRABxgG9gZyYAxAS0xQBVqNMYBeGAIgDNaUZkmWDgBoyFAMoQARogDGmalKxtOiaYgVLMHYAF9gwamGRYuAQ1kgYASQCqiLNbBdUJMQHM8hAPwAueEhozLj4BADcYjx0yHAANmaIiACyIFBafjBSqKixIGZgEeSYIADuZpgAJsmp6f5ZOXkFegbAZjLImBbIMLLxiQEo6Fj0AJ4EVqTkBHgmsiYVMG0onXM9gUOYTi4Zdg6bzqgR+sC9CYgwACIg5hCx3SAAHiZgVQNBw2MTwNOos-Nrg2YW1Q-l2jgOKmIukKFFkqDAywgc1QmAAFABKSYUbFqcZo9Ew8jHbHuEDdAD6snWQIOGKx2KKZIgmDA-AAFtREAA6KmA8EuGDebwkfTY4kUBwU3nvfYuVHSjZOAgQZCg+z81CYsQMmC5bpGZWqmAAaxAI1QXBs6tlh21DJcaINKpgRgBMqVKq1Op11C48up4MNAG0ncgALpsVjsCAva5GEAVdE9eECSAgQne8jIDnchU0gXsPOBlUhsCGsMZsV2-S6IA

以下是代码笔的链接:https://codepen.io/darylshy/pen/YzjWBoG?editors=0011

TypeScript 未定义的 对象文字

评论


答:

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._customerInfotrue{ rewardsMember: true }