从类创建派生类型,但省略构造函数(打字稿)

     2023-03-31     192

关键词:

【中文标题】从类创建派生类型,但省略构造函数(打字稿)【英文标题】:Create a derived type from class, but omit the constructor (typescript) 【发布时间】:2020-02-22 01:08:49 【问题描述】:

我有一个这样定义的接口和类:

interface Foo 
  constructor: typeof Foo;


class Foo 
  static bar = 'bar';

  constructor(data: Partial<Foo>) 
    Object.assign(this, data);
  

  someMethod() 
    return this.constructor.bar;
  

  prop1: string;
  prop2: number;

接口是必需的,以便this.constructor 是强类型的。但是,它破坏了我将普通对象传递给类构造函数的能力:

const foo = new Foo( prop1: 'asdf', prop2: 1234 );

// Argument of type ' prop1: string; prop2: number; ' is not assignable to parameter of type 'Partial<Foo>'.
//  Types of property 'constructor' are incompatible.
//    Type 'Function' is not assignable to type 'typeof Foo'.
//      Type 'Function' provides no match for the signature 'new (data: Partial<Foo>): Foo'.

我了解错误消息,但我不知道如何解决它。有什么办法有一个Partial&lt;Foo&gt; 可以让我传递一个普通的对象?这是一个游乐场:

Playground

【问题讨论】:

不确定你的意图是什么,好像你试图从实例访问静态属性,这是不可能的,接口也是多余的,checkout this 谢谢埃里克。您可以通过this.constructor 从实例访问静态属性,这样做并不少见。冗余接口也是必需的,因为您不能在类定义中键入 constructor 方法。这使用了“接口合并”,这是 TypeScript 的一个特性,也很常见:github.com/microsoft/TypeScript/issues/… 【参考方案1】:

这是从省略构造函数(如问题标题中所示)并保留常规方法的类创建派生类型的实际类型:

type NonConstructorKeys<T> = ([P in keyof T]: T[P] extends new () => any ? never : P )[keyof T];
type NonConstructor<T> = Pick<T, NonConstructorKeys<T>>;

与问题中的Foo 一起使用:

type FooNonConstructorKeys = NonConstructorKeys<Foo>; // "prop1" | "prop2" | "someMethod"
type FooNonConstructor = NonConstructor<Foo>;

【讨论】:

【参考方案2】:

我最终在这个精彩的答案中找到了我需要的东西:

how to remove properties via mapped type in TypeScript

该答案中的代码创建了一个包含 only 方法的派生类型。我需要做相反的事情。以下NonMethods&lt;T&gt; 帮助器创建了一个已删除所有方法的派生类型。

type NonMethodKeys<T> = ([P in keyof T]: T[P] extends Function ? never : P )[keyof T];  
type NonMethods<T> = Pick<T, NonMethodKeys<T>>; 

Here's the Playground

【讨论】:

【参考方案3】:

看起来你想定义一个接口然后使用它,那么你必须在接口本身而不是类中定义属性。

interface Foo 
  prop1: string; // define your properties here
  prop2: number;


class Foo 
  static bar = 'bar';

  constructor(data: Partial<Foo>) 
    Object.assign(this, data);
  

  someMethod() 
    return Foo.bar; // notice how I access static variables now
  



const foo = new Foo( prop1: 'asdf', prop2: 1234 );

Playground

【讨论】:

谢谢。我需要this.constructor,因为这是一个由其他类扩展的基类(例如抽象)。每个扩展类都会定义自己的“bar”值。

打字稿:通过传入命名参数的构造函数创建类?

】打字稿:通过传入命名参数的构造函数创建类?【英文标题】:Typescript:Createclassviaconstructorpassinginnamedparameters?【发布时间】:2018-01-1210:18:11【问题描述】:我有一个类,其中定义了带有3个参数的构造函数,这些参数都是可选... 查看详情

打字稿:将类数组的类型转换为构造类数组的类型

】打字稿:将类数组的类型转换为构造类数组的类型【英文标题】:Typescript:convertingtypeofarrayofclassestotypeofarrayofconstructedclasses【发布时间】:2022-01-2117:50:51【问题描述】:有一个问题我一直在努力解决。我有一个函数,里面放了... 查看详情

打字稿用函数创建自己的类型

】打字稿用函数创建自己的类型【英文标题】:Typescriptcreatingowntypeswithfunctions【发布时间】:2020-06-1310:12:45【问题描述】:我正在尝试创建自己的类型,我可以使用dotsyntax在其上调用函数。例如:letmyOwnType:myByteType=123211345;myOwnTyp... 查看详情

打字稿接口和承诺返回一个对象/构造函数?

...发布时间】:2022-01-1407:10:09【问题描述】:我有一个返回类型的Promiseperson.tsconstpersonFactory:PersonFactory=(name,lastName)=>(speak:()=>console.log 查看详情

反应打字稿测试TypeError:MutationObserver不是构造函数

...间】:2020-07-1701:20:03【问题描述】:上周我使用create-react创建了一个React应用程序。我有一个简单的表单,当我单击提交时会显示一条消息。我想测试一下,这是我创建的测试Samp 查看详情

使用打字稿在构造函数中动态设置类属性

...【发布时间】:2021-12-3105:36:31【问题描述】:我正在尝试创建一个打字稿类MyClass,并在构造函数中动态设置实例属性:constmyInstance=newMyClass((someField:\'foo\'))myInstance.someField//t 查看详情

打字稿从元组/数组值派生联合类型

】打字稿从元组/数组值派生联合类型【英文标题】:Typescriptderiveuniontypefromtuple/arrayvalues【发布时间】:2017-12-2807:58:14【问题描述】:说我有清单constlist=[\'a\',\'b\',\'c\']是否可以从\'a\'|\'b\'|\'c\'这个值联合类型派生?我想要这个是... 查看详情

打字稿不会缩小函数构造函数

】打字稿不会缩小函数构造函数【英文标题】:Typescriptdoesn\'tnarrowonfunctionconstructor【发布时间】:2022-01-1517:24:25【问题描述】:我正在使用一个名为DNSHandler的构造函数,其接口如下所示:interfaceDNSHandlerreceived:Partial<DNSStandardQue... 查看详情

打字稿转换 Object.entries 将派生字符串数组减少为文字类型

】打字稿转换Object.entries将派生字符串数组减少为文字类型【英文标题】:typescriptconvertingObject.entriesreducedderivedstringarraytoliteraltypes【发布时间】:2022-01-0316:54:46【问题描述】:constprogram=morgning:[\'breakfast\',\'mingle\'],evning:[\'mingle\',\... 查看详情

打字稿中的重载函数类型

...2-0711:45:49【问题描述】:如何在不提供具体函数的情况下创建重载的函数类型?通过检查重载函数的类型,似乎可以在接口/对象类型上使用多个调用签名:functiona(input:string):stringfunctiona(input:number):numberfunctiona(input:s 查看详情

打字稿:类型上不存在属性“导航”省略反应导航v5

】打字稿:类型上不存在属性“导航”省略反应导航v5【英文标题】:Typescript:Property"navigation"doesnotexistontypeOmitreactnavigationv5【发布时间】:2021-11-0119:50:59【问题描述】:我正在尝试使用本教程重构我的代码,以从javascript... 查看详情

打字稿:函数参数的类型辅助

...题描述】:我已经编写了一个小库,现在我正在尝试通过创建自定义d.ts文件来为其添加类型支持。举个例子(我的库叫做layerCompose):constC=layerCompose(_($)/*functionbody*/,execute($)/*functionb 查看详情

打字稿中的多个构造函数

】打字稿中的多个构造函数【英文标题】:Multipleconstructorsintypescript【发布时间】:2022-01-2318:32:49【问题描述】:如何在typescript中定义多个构造函数?例如,我想有以下代码:classFolderextendsAssetconstructor(repositoryId:string,assetId:string... 查看详情

打字稿'条件'类型

】打字稿\\\'条件\\\'类型【英文标题】:Typescript\'Conditional\'Types打字稿\'条件\'类型【发布时间】:2019-05-0320:15:49【问题描述】:我有一个简单的函数,原则上它的工作很简单,但类型描述很差,几乎每次我操作数据时都需要类型... 查看详情

打字稿:如何制作接受对象的类型,其键匹配通用但所有值都是值参数的映射函数

】打字稿:如何制作接受对象的类型,其键匹配通用但所有值都是值参数的映射函数【英文标题】:Typescript:Howtomaketypethatacceptsobjectwhichkeysmatchgenericbutallvaluesaremapfunctionsofvalueargument【发布时间】:2020-05-2212:15:44【问题描述】:我... 查看详情

创建一个返回反应组件类的打字稿函数

】创建一个返回反应组件类的打字稿函数【英文标题】:Createatypescriptfunctionreturningreactcomponentclass【发布时间】:2020-06-0319:17:55【问题描述】:我需要创建一个实用函数,它将根据某些条件返回一个反应组件类(而不是实例)。... 查看详情

何时在 Angular2 打字稿中创建构造函数?

】何时在Angular2打字稿中创建构造函数?【英文标题】:WhentocreateconstructorinAngular2typescript?【发布时间】:2016-09-1414:26:05【问题描述】:以下是来自Angular2docs的一些示例构造函数:exportclassAppComponentimplementsOnInittitle=\'Tourofheroes\';her... 查看详情

开玩笑的打字稿 - 模拟日期构造函数

】开玩笑的打字稿-模拟日期构造函数【英文标题】:jesttypescript-MockDateconstructor【发布时间】:2020-07-0917:28:45【问题描述】:我正在尝试模拟newDate()以返回特定日期。以下代码:constnow=newDate()jest.spyOn(global,\'Date\').mockImplementation(()... 查看详情