Typescript 基于用作返回的接口限制数组值
我有以下代码:Typescript 基于用作返回的接口限制数组值,typescript,Typescript,我有以下代码: 导出接口StoreCursor{ 创建日期:日期; id:编号; } 导出默认类PageUtil{ 公共静态解码(游标?:字符串,日期?:(keyof T)[]):T |未定义{ 如果(!游标){ 回来 } const json=Buffer.from(游标,“base64”).toString(“utf8”); 返回JSON.parse(JSON,(key,value)=>(dates?.includes(key)?newdate(value):value)); } } con
导出接口StoreCursor{
创建日期:日期;
id:编号;
}
导出默认类PageUtil{
公共静态解码(游标?:字符串,日期?:(keyof T)[]):T |未定义{
如果(!游标){
回来
}
const json=Buffer.from(游标,“base64”).toString(“utf8”);
返回JSON.parse(JSON,(key,value)=>(dates?.includes(key)?newdate(value):value));
}
}
const decoded=PageUtil.decode(游标,[“已创建”]);
但我得到了下一个错误,我不知道如何解决它:
错误TS2345:类型为“string”的参数不能分配给类型为“keyof T”的参数
我也试过:
公共静态解码(游标?:字符串,日期?:(T&string键)[]):T |未定义{
[...]
}
但错误是相似的:
错误TS2345:类型为“string”的参数不能分配给类型为“keyof T&string”的参数。
类型“string”不可分配给类型“keyof T”
我希望
dates
仅限于StoreCursor
的键(或者更好,仅限于StoreCursor
类型Date
的键)。调用JSON
的键参数被键入string
,而数组中有keyof T
类型的项includes
需要一个与数组中的项类型相同的元素,并且无法在TS中表示类似的内容。如果它是文本类型或键类型,请接受基类型(在本例中为字符串)
您有两种选择之一:
首先,只需断言key
是keyof T
它可能不是,但这就是您正在测试的内容,因此断言不会产生运行时问题:
export default class PageUtil {
public static decode<T>(cursor?: string, dates?: (keyof T)[]): T | undefined {
if (!cursor) {
return;
}
const json = "";
return JSON.parse(json, (key, value) => (dates?.includes(key as keyof T) ? new Date(value) : value));
}
}
我想它的抱怨是正确的,因为在您的类型T中,您传递的是StoreCursor,它不包含任何string类型的参数,而在您的decode()中,第一个参数的类型是string。因此,您需要使泛型类型与函数args兼容。是的,但我试图引用
StoreCursor
(created
或id
)的键,而不是它们的值。我还尝试了导出接口StoreCursor扩展记录{[…]},但错误是相同的。我选择了第一种解决方案,看起来我更清楚。谢谢你。
export default class PageUtil {
public static decode<T>(cursor?: string, dates?: (keyof T)[]): T | undefined
public static decode(cursor?: string, dates?: string[]): any {
if (!cursor) {
return;
}
const json = "";
return JSON.parse(json, (key, value) => (dates?.includes(key) ? new Date(value) : value));
}
}