javascript 为什么我不能在typescript类中定义接口或类型

hc2pp10m  于 2022-12-25  发布在  Java
关注(0)|答案(1)|浏览(210)

我想定义interface| type在typescript类中的代码如下:

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

但我得到了这个错误:Unexpected token. A constructor, method, accessor, or property was expected.

    • 确切的目标是:-**

我正在做一个框架,用户可以在其中扩展基类Randoms并覆盖基类的一些方法,但我没有在子类中获得任何类型的智能。
下面是代码:

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 ('') }
}

此处

{ 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?

    • 提前准备油罐**
ulydmbyx

ulydmbyx1#

目前还不能直接在类体的作用域中声明类型或接口。在microsoft/TypeScript#7061中有一个对它的特性请求,但它不是语言的一部分。即使它是,也不清楚你是否能够将类型导出到类之外。例如,你可以在函数中定义类型,但这些类型的定义在函数之外是不可见的:

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;
  }
}

因此,您可能并不真的希望在类 * 内部 * 定义接口。
相反,正如microsoft/TypeScript#7061上的这篇评论中提到的,你可以做的是merge,这个类带有一个namespace,你可以从中导出你的类型:

export class MyClass {

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

然后,在另一个文件中,导入MyClass并获得类和名称空间:

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

Playground代码链接

相关问题