tl;dr 似乎cache-manager-redis-store
TypeScript 不正确支持该类型,因为该RedisCache
类型是私有的并且无法导入。
作为一种解决方法,您可以将私有类型复制到您自己的文件中:
import { CACHE_MANAGER, Inject, Injectable } from '@nestjs/common';
import { Store } from 'cache-manager';
import Redis from 'redis';
interface RedisCache extends Cache {
store: RedisStore;
}
interface RedisStore extends Store {
name: 'redis';
getClient: () => Redis.RedisClient;
isCacheableValue: (value: any) => boolean;
}
@Injectable()
export class CacheService {
constructor(
@Inject(CACHE_MANAGER)
private cacheManager: RedisCache,
) {
cacheManager.store.getClient();
}
}
深潜
看起来CACHE_MANAGER
NestJS 提供的 是由createCacheManager创建的,它导入 npm 包cache-manager
,然后caching
使用您提供的 store 包调用其功能。
我认为Cache
您使用的类型是从cache-manager
. 该类型在此处定义,并且包含Store
在同一文件中的此处。getClient
不是该接口上的方法方法,因此错误消息是正确的。
但是,由于您使用的是商店的外部包,因此它所caching-manager
了解的内容更多。查看 的类型cache-manager-redis-store
,您可以看到有一个类型RedisStore扩展Store
并包含getClient
。
从cacheManager
技术上讲,getClient
自从您使用 redis 存储包配置它以来,您需要将cacheManager
变量的类型设置RedisCache
为 TypeScript 以允许它。
根据 的 绝对类型 类型,如果您将包导入为cache-manager-redis-store
,您的类型似乎应该是,但似乎存在问题,因为未导出该命名空间。redisStore.CacheManagerRedisStore.RedisCache
redisStore
CacheManagerRedisStore
在 repo 上有一个关于这个问题的问题,并且有一个问题要求 TypeScript 支持。目前,TypeScript 似乎没有正确支持这个包。