首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类型'XX‘不可赋值给类型'YY’。“‘XX”可赋值给“YY”类型的约束,但“YY”可实例化

类型'XX‘不可赋值给类型'YY’。“‘XX”可赋值给“YY”类型的约束,但“YY”可实例化
EN

Stack Overflow用户
提问于 2021-02-19 21:38:25
回答 2查看 51关注 0票数 0

我得到了这个错误:

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

从这段代码中:

代码语言:javascript
复制
function getValue ():{[key: string]: any}  {
    return {key:'value'}
}

class Foo<T extends {[key: string]: any}> {
    public readonly data?: T

    constructor() {
        this.data = getValue()
    }
}

有没有人知道为什么和如何解决这个错误?

EN

回答 2

Stack Overflow用户

发布于 2021-02-19 23:04:05

您是否希望存储类型为T的条目的字典?也许这就是你想要的?:

代码语言:javascript
复制
function getValue ():{[key: string]: any}  {
    return {key:'value'}
}

class Foo<T> {
    public readonly data?: {[key: string]: T}

    constructor() {
        this.data = getValue()
    }
}
票数 0
EN

Stack Overflow用户

发布于 2021-02-19 23:07:30

编译器抱怨您没有在getValue函数的返回类型和data实例属性之间建立直接关系。extends子句只保证泛型类型参数至少可赋值给所提供的约束,但不会以其他方式绑定它。

此外,您的getValue函数返回一个{ key : 'value' }类型的常量。因此,当您将对getValue的调用的返回类型分配给this.data时,编译器会检查后者是否是前者的超类型,并看到您只保证data{ [key: string]: any },或者,简单地说:

“某种对象,具有任意数量的字符串类型的键和任意类型的值”

显然,data不能与{ key : 'value' }类型有任何共同之处。现在,看看如果显式地告诉编译器T应该符合getValue的返回类型,会发生什么:

代码语言:javascript
复制
class Foo<T extends {[key: string]: any}> {
    public readonly data?: T | ReturnType<typeof getValue>;

    constructor() {
        this.data = getValue(); //OK
    }
}

现在编译器很高兴了,因为它可以建立关系,但是您只能使用具有单键keystring类型的值的对象。坦率地说,从您的代码片段中,根本不清楚为什么需要使类成为泛型:

代码语言:javascript
复制
class Foo {
    public readonly data?: ReturnType<typeof getValue>;

    constructor() {
        this.data = getValue(); //OK
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66278649

复制
相关文章

相似问题

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