gpt4 book ai didi

javascript - 如何在 typescript 中键入一个动态加载其自己的成员的类

转载 作者:行者123 更新时间:2023-12-03 05:17:27 27 4
gpt4 key购买 nike

您好,我使用的是 typescript 2.1.4,但遇到了这个问题。

假设我有一个看起来像这样的对象

interface IObj{
key1:ISubObj;
}
interface ISubObj{
exp:RegExp;
method:(param:string)=>boolean
}
const obj:IObj={
key1: {
exp: /someexp/i,
method: somemethod
}
}

somemethod看起来像这样

function somemethod(regexp){
return function(param){
return regexp.test(param)
}
}

在类型脚本中,我创建了一个如下所示的类

export class someClass {
constructor(obj) {
for (let k in obj) {
this[k]=obj[k].method(obj[k].exp)
}
return this;
}
}
export const Foo = new someClass(obj);

我遇到的问题是,它解析为有效的 javascript 但是,使用 Foo.key1(param) 返回类型 error 。 Foo 上不存在 key1

我在类上使用了 implements someInterface,但只有当我使用 key1 作为可选时,该接口(interface)才有效。我不想使用可选语法

interface someInterface {
key1?:(param:string)=>boolean
}
export class someClass implements someInterface{...}

有没有办法在动态构造的类上创建有效类型?

编辑

更正了 obj 未传递到构造函数中的拼写错误

编辑

使用@toskv回答,我稍微改变了我的解决方案以获得我想要的效果。但这可能不是最好的方法

interface IObj{
key1:ISubObj;
}
interface ISubObj{
exp:RegExp;
method:(param:string)=>boolean
}
const obj:IObj={
key1: {
exp: /someexp/i,
method: somemethod
}
}
export interface ISomeClass{
key1:(str:string)=>boolean;
}
export type TSomeClass<T> = {
[P in keyof T]?=T[P]
}
export class someClass {
constructor(obj) {
for (let k in obj) {
this[k]=obj[k].method(obj[k].exp)
}
return this;
}
}
export const Foo:TSomeClass<ISomeClass> = new someClass(obj);

最佳答案

可能有更好的方法来做到这一点,但这里有一些可以开始的东西。

您可以使用2.1中添加的ma​​ppedTypes来创建基于IObj接口(interface)的新类型。

interface IObj {
key1: ISubObj;
}
interface ISubObj {
exp: RegExp;
method: (param: string) => boolean
}

type Result = {
// must be optional so we can initialize it with nothing
[P in keyof IObj]?: boolean
}

class Mine {
// it's not really a property of the class but hey it's typed
public results: Result = {};

constructor(obj: IObj) {
for (let k in obj) {
this.results[k] = obj[k].method(obj[k].exp)
}
return this;
}
}

// autocomplete and everything
new Mine(null).results.key1

Here这是 Playground 上的一个例子。

您可以在2.1 release notes中阅读有关映射类型的更多信息。 .

在这种情况下,该类实际上没有意义。转换数据的函数也同样有效。

function testIObj(obj: IObj): Result {
let results: Result = {};
for (let k in obj) {
results[k] = obj[k].method(obj[k].exp)
}
return results;
}


testIObj(null).key1;

这使您可以做一些好事,例如轻松处理整个列表。

如果方法函数将返回不同的类型,那么扩展以适应它们也相对容易。

 type Result = {
// must be optional so we can initialize it with nothing
[P in keyof IObj]?: boolean | number
}

关于javascript - 如何在 typescript 中键入一个动态加载其自己的成员的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41549345/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com