為什么Typescript類不“知道”它自己的屬性?

我們想在超類上創(chuàng)建一個(gè)泛型方法,該方法接受一個(gè)參數(shù),該參數(shù)是子類上某一類型的任何屬性的名稱。考慮一下這個(gè)(非常做作的)例子:

class CanUpcase {
    upcase<PropertyName extends keyof this>(
        propertyName: this[PropertyName] extends string ? PropertyName : never
    ) {
        return this[propertyName].toUpperCase(); // Property 'toUpperCase' does not exist on type 'this[this[PropertyName] extends string ? PropertyName : never]'.
    }
}

class User extends CanUpcase {
    age = NaN;

    name = ``;

    constructor() {
        super();

        this.upcase('name'); // Argument of type '"name"' is not assignable to parameter of type 'this["name"] extends string ? "name" : never'.ts(2345)
    }
}

const user = new User();
user.upcase('name'); // No error

我們預(yù)期upcase會(huì)接受'name',因?yàn)?code>'name'屬性是一個(gè)字符串。

然而,當(dāng)user.upcase('name')按預(yù)期工作時(shí),this.upcase('name')拋出了一個(gè)錯(cuò)誤,如圖所示。

此外,在upcase內(nèi),this[propertyName]不被識(shí)別為字符串。

  1. 為什么this.upcase拋出錯(cuò)誤而不是user.upcase
  2. 為什么this[propertyName]不被識(shí)別為字符串?

Thanks!

? 最佳回答:
  1. 這個(gè)問(wèn)題源于這樣一個(gè)事實(shí),即TypeScript不會(huì)像對(duì)具體實(shí)例(用戶)那樣在類內(nèi)縮小范圍。
  2. 發(fā)生這種情況是因?yàn)門ypeScript在方法中沒(méi)有正確跟蹤propertyName和此[propertyName]之間的關(guān)系。

關(guān)鍵問(wèn)題在于這條線:

return this[propertyName].toUpperCase();

盡管我們將propertyName限制為僅包含[propertyName]為字符串的鍵,但TypeScript不會(huì)將此約束應(yīng)用于此[propertyName]的解析類型。這是由于使用條件類型時(shí)TypeScript的類型推理限制造成的。

解決方案:使用顯式泛型約束

class CanUpcase {
    upcase<K extends keyof this & string>(propertyName: this[K] extends string ? K : never) {
        return (this[propertyName] as unknown as string).toUpperCase();
    }
}

主站蜘蛛池模板: 韩国福利一区二区三区高清视频| 国产在线观看精品一区二区三区91| 色婷婷香蕉在线一区二区| 91视频一区二区三区| 精品国产一区二区三区2021| 天堂一区二区三区精品| 国产一区二区三区在线2021 | 亚洲国产成人一区二区精品区| 亚洲综合色一区二区三区| 国产精品无码一区二区在线观一| 在线免费观看一区二区三区| 3D动漫精品啪啪一区二区下载 | 国产精品无码一区二区在线观一| 欧美av色香蕉一区二区蜜桃小说 | 亚洲日韩一区二区一无码| 久久久久女教师免费一区| 日本一区二区三区精品国产 | 久久亚洲国产精品一区二区| 无码人妻久久一区二区三区蜜桃| 国产成人av一区二区三区不卡 | 久久一区二区三区精品| 亚洲日韩精品一区二区三区| 日韩一本之道一区中文字幕| 亚洲国产av一区二区三区| 日本一区二区高清不卡| 久久一区二区三区99| 狠狠综合久久AV一区二区三区 | 一级毛片完整版免费播放一区| 日韩免费视频一区| 国产免费av一区二区三区| 国产一区在线观看免费| 高清在线一区二区| 国产情侣一区二区三区| 中文字幕一区二区三区有限公司 | 亚洲性日韩精品国产一区二区| 日本一区二区三区中文字幕| 久久久久国产一区二区三区| 国产精品特级毛片一区二区三区| 无码人妻精品一区二区三区久久| 人妻体内射精一区二区三区| 在线免费视频一区二区|