為什么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永久一区二区国产AV| 日韩精品一区二区三区四区| 国产一区在线电影| 国产精品久久一区二区三区| 在线精品亚洲一区二区三区| 在线观看午夜亚洲一区| 精品亚洲A∨无码一区二区三区| 亚洲精品一区二区三区四区乱码| 亚洲精品伦理熟女国产一区二区| 精品视频一区二区| 国产成人一区二区三区视频免费| 亚洲va乱码一区二区三区| 大香伊蕉日本一区二区| 国产一区二区三区手机在线观看| 人妻少妇一区二区三区| 国产福利一区二区三区视频在线 | 国产亚洲一区二区三区在线不卡| 国产精品无圣光一区二区| 亚洲综合一区无码精品| 亚洲国产成人久久一区WWW| 日韩免费观看一区| 日本精品夜色视频一区二区| 无码精品人妻一区二区三区漫画| 无码人妻一区二区三区免费| 日本人的色道www免费一区| 国产内射999视频一区| 国模无码一区二区三区| 日韩精品无码一区二区视频| 天堂一区二区三区在线观看| 在线精品国产一区二区三区| 精品欧美一区二区在线观看| 久草新视频一区二区三区| 日本精品一区二区三区视频| 久久亚洲一区二区| 亚洲国产精品一区二区第一页免 | 中文字幕人妻丝袜乱一区三区 | 国产区精品一区二区不卡中文| 日本v片免费一区二区三区| 国产在线一区二区综合免费视频| 日韩色视频一区二区三区亚洲| 人妻夜夜爽天天爽爽一区|