Home > Mobile >  why i can't define interface or type inside typescript class
why i can't define interface or type inside typescript class

Time:12-24

I want to define interface | type inside the typescript class here is the code:

class MyClass {
    interface IClass {
        name: string,
        id: string
    }
}

but I'm getting this error: Unexpected token. A constructor, method, accessor, or property was expected.

Exactly want to achieve:-

I'm making a framework where the user to extend the base class Randoms and override a few methods of the base but I'm not getting any type of intelligence in the child class.
here is the code:

abstract class RandomsRoute {
   public get (req:Resquest, res:Response): Promise <void> { res.send ('') }
}

// client side

import RandomsRoute, { Request, Response } from '@my-pkg'

class Client extends RandomsRoute {
   // public get (req, res) {res.send('client side')} // error here
   public get (req: Request, res: Response): Promise <void> { res.send ('') }
}

here the

{ Request, Response } from '@my-pkg'

I don't want the user to make lots of imports can we simplify this anymore or maybe provide some better APIs to user?

Tanks in Advance

CodePudding user response:

It is not currently possible to declare types or interfaces directly in the scope of a class body. There is a feature request for it at microsoft/TypeScript#7061, but it's not part of the language. Even if it were, it's not clear that you'd be able to export the types out of the class. For example, you can define types in functions, but the definitions of these types are invisible outside the function:

function foo() {
  interface Foo {
    a: string,
    b: number;
  }
}

const f: Foo = {a: "", b: 1}; // error!
// ----> ~~~ cannot find name Foo

const g: foo.Foo = {a: "", b: 1}; // error!
// ----> ~~~ cannot find namespace foo

function foo() {
  export interface Foo { // error!
  //~~~~ <-- modifiers cannot appear here.
    a: string,
    b: number;
  }
}

So you probably don't really want to define your interface inside the class.


Instead, what you can do, as mentioned in this comment on microsoft/TypeScript#7061 is merge the class with a namespace from which you export your type:

export class MyClass {

}
export declare namespace MyClass {
  export interface IClass {
    name: string,
    id: string
  }
}

Then, in your other file, you can import MyClass and get both the class and the namespace:

import { MyClass } from '@my-pkg'
const c: MyClass = new MyClass();
const i: MyClass.IClass = { name: "", id: "" };

Playground link to code

  • Related