有没有一种方法可以通过提供名称(字符串)来解析类型



我试着看看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 

游乐场链接

最新更新