【问题标题】:TS2345: Argument of type 'string' is not assignable to parameter of type 'never'TS2345:“字符串”类型的参数不可分配给“从不”类型的参数
【发布时间】:2021-08-19 17:09:24
【问题描述】:

我有以下 Angular 服务

import { Injectable } from '@angular/core'

import { DictUnit } from '@activejs/core'

@Injectable({
    providedIn: 'root',
})
export class RegistrationState {
    private _dictionaryUnit = new DictUnit({
        id: 'registration',
        immutable: true,
        persistent: true,
        cacheSize: 200,
        // initialValue: {},
        distinctDispatchCheck: true,
    })

    get dictUnit() {
        return this._dictionaryUnit
    }
}

我将服务注入到我的组件中:

export class AgeComponent {
    age: IAge = new Age()
    
    constructor(private regState: RegistrationState) {
    }

    onDobValueChanged(e: any) {
        const dob = dayjs(e.value).toDate()
        const years = dayjs().diff(dob, 'year')


        // TS2345: Argument of type 'string' is not assignable to parameter of type 'never' - ERROR REFERES TO 'age' param
        this.regState.dictUnit.set('age', this.age) 
    }

    onDodValueChanged(e: any) {
        this.age.dod = dayjs(e.value).toDate()
        console.log({ dod: this.age.dod })
    }
}

set函数的API在https://api.activejs.dev/classes/dictunit.html#set

为什么我会得到这个结果?

我正在使用以下 #1 "typescript": "~4.1.5" - 严格模式 #2 "@angular/cli": "^11.2.12", #3 Linux Mint Ulyana

谢谢

【问题讨论】:

    标签: angular typescript typescript-generics


    【解决方案1】:

    需要明确告知DictUnit 它正在存储什么数据类型。如果没有指定,它将使用Record<never, never>。

    因此,在你的组件类中设置年龄时,它会警告你类型不兼容(字符串!=从不)。

    一个简单的修复将是这样的:

    private _dictionaryUnit = new DictUnit<Record<string, unknown>>({ // inform DictUnit it is storing key as string and value as unknown 
        id: "registration",
        immutable: true,
        persistent: true,
        cacheSize: 200,
        // initialValue: {},
        distinctDispatchCheck: true
    });
    

    这里是简单演示的codeandbox:

    https://codesandbox.io/s/rough-cloud-bz51m?file=/src/app/registration-state.service.ts:255-264


    附言

    您可以将未知类型更改为更受限制,例如string | boolean | number。

    【讨论】:

    • 非常感谢老兄。欣赏它。我在 Typescript 中启用了严格模式,它让我回到学校!
    猜你喜欢
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 2018-07-28
    • 2018-02-09
    • 2022-11-21
    • 2018-02-21
    • 1970-01-01
    相关资源
    最近更新 更多