繁体   English   中英

Lint 嵌套 Typescript 泛型

[英]Lint nested Typescript Generics

我正在寻找一种使用打字稿定义正确表达我的数据模型的方法。 到目前为止,我有以下几点:

type Data = Record<string, string>;

interface DataContainer<D extends Data> { 
    id: string;    
    data: D;
}

interface Context {
    dataContainers: DataContainer<any>[];
}

打字稿游乐场

一个Context存储一组DataContainers ,其中每个DataContainer在特定数据结构D是通用的。 现在我想表达的是,每个数据结构D都应该遵循一个通用类型Data 即由任意但固定的<string, string>对组成。

我真的找不到合适的解决方案,我找到的最好的东西是DataContainer<D extends Data> 你认为这是一个好方法吗?

至少以下内容会根据需要给出我的 linting 错误:

interface MyData extends Data {
    x: "1",
    y: 2, // Lint error, because not string. (As I want it)
}

所以我得出结论,在编写<D extends Data>时,也不允许D有像y: 2这样的条目,对吗?

现在对我来说是真正的问题在于以下给我一个掉毛的错误:

const myContext: Context = {
    dataContainers: [
        {
            id: "123",
            data: {
                x: 1, // This should be marked by the linter
                y: "2", 
                z: {a: 1}, // This also
            }
        }
    ]
}

我正在寻找一种方法来为我的定义建模,以便 linter 将其标记为无效,因为不存在D使得上述内容成为有效的上下文。 那可能吗? 谢谢你的帮助!

你很近。 问题在于DataContainer<any> Any 有效地关闭使用它的类型检查。 这意味着由于DataContainer<any> data将是any类型,因此不会对该属性进行检查。 这与您对D施加的约束无关

简单的解决方案是不使用any ,使用约束作为DataContainer的类型参数:


interface Context {
    dataContainers: DataContainer<Data>[];
}

游乐场链接

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM