TS2345: Аргумент типа «строка» не может быть присвоен параметру типа «никогда»

#angular #typescript #typescript-generics

Вопрос:

У меня есть следующий угловой сервис

 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 })
    }
}

 

API для функции set находится по адресу https://api.activejs.dev/classes/dictunit.html#set

Почему я получаю такой результат?

Я использую следующий #1 «машинопись»: «~4.1.5» — строгий режим #2 «@angular/cli»: «^11.2.12», #3 Linux Mint Ульяна

Спасибо

Ответ №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
});
 

Вот код и поле для простой демонстрации:

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


P.S.

Вы можете изменить неизвестный тип на более ограниченный, например string | boolean | number .

Комментарии:

1. Большое спасибо, парень. Ценю это. Я включил строгий режим в машинописном тексте, и он возвращает меня в школу!