簡體   English   中英

Typescript:允許泛型類型只是具有'string'屬性的對象

[英]Typescript: allow a generic type to only be an object with 'string' properties

我想知道在TS中是否可以強制執行泛型的屬性類型。 我想只允許傳遞帶有'string'屬性的對象類型的泛型。 如果傳遞的通用接口包含數字或符號屬性,則引發錯誤。

這是我嘗試過的POC ,並評論了我正在尋找的行為:

class Test<T extends {[key: string]: any}>{
    private data: T;

    public getValue<K extends keyof T>(key: K): T[K] {
        return this.data[key];
     }
}

// the property is a string = ok
const okay = new Test<{ "aString": string }>();

// the property is a number = should raise an error
const shouldFail = new Test<{ 0: string }>();

如果對象具有字符串索引,我們也可以按編號索引對象,因此編譯器沒有理由拋出錯誤數字鍵。 這是設計的。

declare let skeys: { [key: string]: number }
let v1 = skeys[0] // number 
let v2 = skeys["0"] // number

declare let nkeys: { [key: number]: number }
let v3 = nkeys[0] // number 
let v4 = nkeys["0"] // error 


declare let snkeys: {
    [key: number]: number;
    [key: string]: string | number // The string index has to contain any value reuned by the number index
}
let v5 = snkeys[0] // number 
let v6 = snkeys["0"] // string| number 

如果對象包含任何非字符串鍵,我們可以使用條件類型強制錯誤。 錯誤不是很漂亮,但它是可讀的,可以完成工作:

class Test<T extends { [key: string]: any } & (keyof T extends string ? {} : "T must obnly have string keys") >{
    private data!: T;

    public getValue<K extends keyof T>(key: K): T[K] {
        return this.data[key];
    }
}

// the property is a string = ok
const okay = new Test<{ "aString": string }>();
// Error: Type '{ 0: string; }' does not satisfy the constraint '{ [key: string]: any; } & "T must only have string keys"'.
const shouldFail = new Test<{ 0: string }>();

注意

如果對T的值沒有任何其他約束,則簡單object類型也可以

class Test<T extends object & (keyof T extends string ? {} : "T must only have string keys") >{ }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM