假设我有这样的代码:

class SuperElement extends Something {
  render(subclassInstance: ???) {}
}

class MyElement extends SuperElement {
  render({ sayHello }) {
    sayHello('Foo');
  }

  sayHello(name: string);
}

有没有办法让我的IDE在render(MyElement)中正确地自动完成?

我试着用(subclassInstance: this),但不起作用.

推荐答案

从概念上讲,您确实希望使用the polymorphic this type来表示潜在子类的类型.这实质上是实现类的隐式generic类型参数constrained,只有在以后作为方法调用时才会指定:

class SuperElement {
  render(subclassInstance: this) { }
}

new SuperElement().render;
// (method) SuperElement.render(subclassInstance: SuperElement): void
// this type inferred to be --------------------> ^^^^^^^^^^^^

class SomeSubElement extends SuperElement {
  foo = 123;
}    
new SomeSubElement().render;
// (method) SuperElement.render(subclassInstance: SomeSubElement): void
// this type inferred to be --------------------> ^^^^^^^^^^^^^^

不幸的是,当您在TypeScrip中重写方法时,子类不能从超类类型推断其参数类型.您必须自己设置annotate个参数,然后针对超类方法参数类型设置checked个参数类型,以确保兼容性.这是TypeScrip中一个长期存在的痛点;要求从父类继承参数类型的相关开放问题是microsoft/TypeScript#23911.在此之前,除非它被实施,否则,您将被困在这样做:

class MyElement extends SuperElement {
  render({ sayHello }: this) {
    // annotate ---> ^^^^^^
    sayHello('Foo');
  }    
  sayHello(name: string) {}
}

这不是很好,但至少捕捉到了错误:

class OopsElement extends SuperElement {
  render({ sayHowdy }: this) { // error!
    //     ~~~~~~~~ <--
    // Property 'sayHowdy' does not exist on type 'OopsElement'    
  }
  sayHello(name: string) {}
}

Playground link to code

Typescript相关问答推荐

交叉点对数字和布尔的处理方式不同

为什么缩小封闭内部不适用于属性对象,但适用于声明的变量?

带有微前端的动态React路由问题

泛型和数组:为什么我最终使用了`泛型T []`而不是`泛型T []`?<><>

Typescript泛型类型:按其嵌套属性映射记录列表

为什么有条件渲染会导致material 自动完成中出现奇怪的动画?

ANGLE独立组件布线错误:没有ActivatedRouting提供程序

使用KeyOf和Never的循环引用

@TANSTACK/REACT-QUERY中发生Mutations 后的数据刷新问题

自定义 Select 组件的类型问题:使用带逗号的泛型类型<;T与不带逗号的<;T&>;时出错

在Cypress中,您能找到表格中具有特定文本的第一行吗?

在打字脚本中对可迭代对象进行可变压缩

在正常函数内部调用异步函数

错误:NG02200:找不到类型为';对象';的其他支持对象';[对象对象]';.例如数组

打印脚本中正则函数和函数表达式的不同类型缩小行为

使用Cypress测试从Reaction受控列表中删除项目

为什么TypeScrip假定{...省略类型,缺少类型,...选取类型,添加&>}为省略类型,缺少类型?

在ts中获取级联子K类型?

在类型{}上找不到带有string类型参数的索引签名 - TypeScript

数据库中的表请求返回如下日期:2023-07-20T21:39:00.000Z 我需要将此数据格式化为 dd/MM/yyyy HH:mm