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));
    }
}