【发布时间】:2017-05-23 19:01:07
【问题描述】:
您好,我正在使用typescript 2.1.4,但我遇到了这个问题。
想象一下我有一个看起来像这样的object
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。 key1 在 Foo 上不存在。
我在课堂上使用了implements someInterface,但只有当我使用key1 作为可选时,接口才有效。我宁愿不使用可选语法
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);
【问题讨论】:
-
obj 是否有特定类型的类型或者可以是任何类型?
-
@toskv obj 将继续遵循相同的模式,因此它将按照您看到的方式输入。我编辑显示 obj 类型;
-
btw.. 这可能不是问题,但是.. 你实际上并没有将 obj 传递给构造函数。 :)
标签: javascript class typescript types