首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ts(2322)型标泛型

ts(2322)型标泛型
EN

Stack Overflow用户
提问于 2022-11-28 23:32:51
回答 1查看 50关注 0票数 1

我可能错过了什么,但我尝试使用ClassConstructorclass-transformer和我有一个问题

代码语言:javascript
复制
import { ClassConstructor } from 'class-transformer'

class A {}

type Types = A

const myFunction = <T extends Types>(type: ClassConstructor<T>): T[] => {
  if (type === A) {
    const arrayOfA: A[] = []

    return arrayOfA
  }
  return []
}

在这样做之后,对于return arrayOfA,类型记录告诉我:

代码语言:javascript
复制
Type 'A[]' is not assignable to type 'T[]'.
  Type 'A' is not assignable to type 'T'.
    'A' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint 'A'.ts(2322)

这是class-transformer的功能

代码语言:javascript
复制
export declare type ClassConstructor<T> = {
    new (...args: any[]): T;
};

有人想要替换ClassConstructor或解决different subtype of constraint错误吗?

EN

回答 1

Stack Overflow用户

发布于 2022-11-29 01:46:53

这里的问题是,T通常将由type参数的类型确定,请考虑以下几点:

代码语言:javascript
复制
import { ClassConstructor } from 'class-transformer'

class A { a = 1; b = "" }
class B { a = ""; b = 1 }
class C {}

type Types = A | B

const myFunction = <T extends Types>(type: ClassConstructor<T>): T[] => {
  return []
}

myFunction(A) // returns A[]
myFunction(B) // returns B[]
myFunction(C) // doesn't compile

所以发生在你身上的是,打字稿并没有理解这个条件的含义:if (type === A)。假设Types是在您的代码中定义的,就像上面我的代码所定义的那样。因为它不理解条件的含义,它就好像你在做:

代码语言:javascript
复制
type Types = A | B

const myFunction = <T extends Types>(type: ClassConstructor<T>): T[] => {    
  const arrayOfA: A[] = []

  return arrayOfA
}

既然T和A一样容易成为B,而A和B是不相容的,它就会毫无保留地抱怨。

解决方案很简单,只需将arrayOfA类型更改为T[]

代码语言:javascript
复制
const myFunction = <T extends Types>(type: ClassConstructor<T>): T[] => {
  if (type === A) {
    const arrayOfA: T[] = []

    return arrayOfA
  }
  return []
}

当您在这样的函数调用上悬停时:

代码语言:javascript
复制
myFunction(A) 

您将看到它正确地选择了返回类型的A[]

或者,如果您正在arrayOfA上操作,并且需要将其键入为A[],则可以在返回它之前将其强制发送给T[]

代码语言:javascript
复制
const myFunction = <T extends Types>(type: ClassConstructor<T>): T[] => {
  if (type === A) {
    const arrayOfA: A[] = []
    doSomethingWithAValues(arrayOfA);

    return arrayOfA as T[]
  }
  return []
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74607593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档