我试着看看redux中的createSlice
是如何工作的,但没有成功。
示例:
import { createSlice } from '@reduxjs/toolkit'
const counterSlice = createSlice({
name: 'counter',
initialState: 0,
reducers: {
increment: (state) => state + 1,
},
})
// The editor aware of `counterSlice.actions.increment`
它是如何工作的?
回到主题,有没有一种方法可以通过给定的名称来解析类型?例如:
class Resolver {
register( name, type ) {
// Do something
}
get( name ) {
// return the Type.
}
}
// The editor should aware of the type that been registered
谢谢。
您可以这样做。首先,你不能注册类型,类型在运行时不存在,你可以注册特定类型的值。
根据您想要注册值的方式,有几个选项:
您可以让register
返回具有不同类型的解析程序,该类型包含有关新注册类型的信息:
class Resolver<T extends Record<string, unknown> = {}> {
private values = {} as T;
register<N extends PropertyKey, V extends unknown>(name: N, type: V): Resolver<T & Record<N, V>> {
let self = this as Resolver<Record<N, V>>
self.values[name] = type
return this as any;
}
get<N extends keyof T>(name: N): T[N] {
return this.values[name]
}
}
const r = new Resolver()
.register("A", () => "")
.register("B", 0);
let v1 = r.get("A"); // () => ""
let v2 = r.get("B"); // number
游乐场链接
如果你想在一个文件中注册值,你可以让register是一个自定义类型的断言:
class Resolver<T extends Record<string, unknown> = {}> {
private values = {} as T;
register<N extends PropertyKey, V extends unknown>(name: N, type: V): asserts this is Resolver<T & Record<N, V>> {
let self = this as Resolver<Record<N, V>>
self.values[name] = type
}
get<N extends keyof T>(name: N): T[N] {
return this.values[name]
}
}
const r: Resolver = new Resolver()
r.register("A", () => "");
r.register("B", 0);
let v1 = r.get("A"); // () => ""
let v2 = r.get("B"); // number
// Lock in the type before we export
export const finalR = r;
游乐场链接
或者,如果有r
的单个实例,您可以使用接口合并将项目添加到接口:
interface ResolverValues {
}
class Resolver {
private values = {} as ResolverValues;
register<N extends keyof ResolverValues>(name: N, type: ResolverValues[N]) {
this.values[name] = type
}
get<N extends keyof ResolverValues>(name: N): T[N] {
return this.values[name]
}
}
const r: Resolver = new Resolver()
const A = () => "";
// if in another module you can use module augmentation
// declare module "./module-with-resolver" { interface ResolverValues { "A": typeof A } }
interface ResolverValues { "A": typeof A }
r.register("A", A);
const B = 0;
interface ResolverValues { "B": typeof B }
r.register("B", B);
let v1 = r.get("A"); // () => ""
let v2 = r.get("B"); // number
游乐场链接