為什么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();
    }
}

主站蜘蛛池模板: 国产伦一区二区三区高清 | 麻豆AV一区二区三区| 成人精品视频一区二区三区不卡 | 加勒比无码一区二区三区| 国产一区二区视频在线观看| 国产精品视频一区国模私拍 | 日韩精品区一区二区三VR| 一区二区视频免费观看| 国产欧美一区二区精品仙草咪| 精品一区二区三区在线视频| а天堂中文最新一区二区三区| 无码视频免费一区二三区| 亚洲高清美女一区二区三区| 色一乱一伦一图一区二区精品| 亚洲一区二区视频在线观看| 国产午夜一区二区在线观看 | 久久福利一区二区| 中文字幕一区二区三区免费视频 | 无码精品久久一区二区三区| 无码人妻精一区二区三区| 色婷婷av一区二区三区仙踪林| 亚洲视频一区在线播放| 自拍日韩亚洲一区在线| 国产福利一区二区三区视频在线| 久久国产精品一区二区| 无码日韩精品一区二区三区免费| 国产无套精品一区二区| 亚洲夜夜欢A∨一区二区三区| 中文字幕在线播放一区| 成人精品一区二区三区中文字幕 | 亚洲AV成人一区二区三区观看| 日韩一区二区视频| 大帝AV在线一区二区三区| 精品国产一区二区三区香蕉事 | 亚洲高清一区二区三区| 成人精品一区二区三区电影| 在线观看日韩一区| 久久久久国产一区二区| 午夜天堂一区人妻| 日本一区二三区好的精华液 | 国产精品污WWW一区二区三区|