动态定义参数类型



我正在用TypeScript编写一个库。它是一种配置语言的超集,并且本身是可配置的。

在一个特定的上下文中,我想声明一个具有任何形状的对象的类,该对象将通过库用户可以提供的函数转换为预期的形状(并且我提供了默认值)。超简化版本:

// Defined by a library user
interface Input {
myName: string;
};
// Defined by my library, and non-configurable
interface Output {
name: string;
};
// Defined by a library user (with a default fallback)
const mappingFunc = (input: Input): Output => ({
name: input.myName
});
new MyClass({ myName: "Whatever" }, mappingFunc);

在类中,mappingFunc将生成类操作的对象(默认映射函数将接受并返回一个输出形状的对象),但是这种模式允许库的用户指定他们想要的映射,并声明他们想要传入的对象形状,只要映射函数返回一个输出形状的对象。

你知道怎么做吗,或者这是可能的吗?我尝试了下面的方法,但没有成功。类型检查器没有检测输入与输入接口不匹配,实际上根本没有检查输入。

// Defined by my library
interface Output {
name: string;
};
// Defined by my library
const makeClass = (mappingFunc: (unknown) => Output) =>
class SpecifiedMyClass(input: unknown) {
// Uses mappingFunc internally
}
return SpecifiedMyClass
}
// Below defined by user of the library
interface Input {
myName: string;
};
const typedMappingFunc = (input: Input): Output => ({
name: input.myName
});
const MyClass = makeClass(typedMappingFunc);
new MyClass({ myName: "Whatever" });

我要做的是能够将input参数的类型声明为动态定义的MyClass。什么好主意吗?很难解释

// Defined by my library
const makeClass = <T extends unknown>(mappingFunc: (T) => Output) =>
class SpecifiedMyClass(input: T) {
// Uses mappingFunc internally
}
return SpecifiedMyClass
}

也许我没有正确理解这个问题,但是我想这应该能解决你的问题。

最新更新