gpt4 book ai didi

typescript :允许泛型类型只能是具有 'string' 属性的对象

转载 作者:搜寻专家 更新时间:2023-10-30 21:11:53 25 4
gpt4 key购买 nike

我想知道在 TS 中是否可以强制泛型的属性类型。我只想允许传递具有“字符串”属性的对象类型的泛型。例如,如果传递的通用接口(interface)包含数字或符号属性,则会引发错误。

这是一个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") >{ }

关于 typescript :允许泛型类型只能是具有 'string' 属性的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52659630/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com