You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将指定TypeScript泛型类型转换为对应C#语法?

把TypeScript类型转换成C#的可行方案

没问题,我来帮你把这些TypeScript类型转换成符合C#语法规范的写法~你原来想写的public class Excludable<T> : T where T : FilterValue行不通,是因为C#里类不能直接继承一个泛型类型参数——类只能继承具体的类或者接口,没法把T当作父类来用。下面给你两种常用的可行方案:

第一步:先定义基础的FilterValue和AreaFilterValue

先把TypeScript里的基础类型转换成C#类:

// 对应TS的FilterValue类型
public class FilterValue
{
    public int Id { get; set; }
    public string Label { get; set; }
}

// 假设LocationTaxonomy是你已经定义好的类型(比如枚举或类)
// 对应TS的AreaFilterValue类型
public class AreaFilterValue : FilterValue
{
    // TS里的字面量类型"Area",在C#里可以用只读属性固定值
    public string Type => "Area";
    public LocationTaxonomy? Taxonomy { get; set; }
}

方案一:组合模式(推荐,符合C#设计习惯)

用组合的方式,把T作为Excludable<T>的一个属性,而不是继承它:

public class Excludable<T> where T : FilterValue
{
    // 存储原FilterValue类型的实例
    public T Value { get; set; }
    // 对应TS里的可选isExcluded属性
    public bool? IsExcluded { get; set; }
}

使用示例

// 创建一个可排除的区域筛选值
var excludableArea = new Excludable<AreaFilterValue>
{
    Value = new AreaFilterValue 
    { 
        Id = 1, 
        Label = "北京市", 
        Taxonomy = LocationTaxonomy.City // 假设这是LocationTaxonomy的枚举值
    },
    IsExcluded = false
};

// 访问属性
Console.WriteLine(excludableArea.Value.Label); // 输出"北京市"
Console.WriteLine(excludableArea.IsExcluded); // 输出"False"

这种方案的好处是不需要修改原有的FilterValue子类,灵活性很高,不管后续新增什么Filter子类,都可以套进Excludable<T>里。

方案二:接口+抽象类(贴近TS交叉类型的感觉)

如果你希望IsExcluded直接作为Filter子类的属性(类似TS里的交叉类型T & { isExcluded?: boolean }),可以用接口+抽象类的方式:

// 定义可排除的接口
public interface IExcludable
{
    bool? IsExcluded { get; set; }
}

// 用抽象类把FilterValue和IExcludable组合起来,方便子类继承
public abstract class ExcludableFilterValue : FilterValue, IExcludable
{
    public bool? IsExcluded { get; set; }
}

// 让AreaFilterValue继承这个抽象类
public class AreaFilterValue : ExcludableFilterValue
{
    public string Type => "Area";
    public LocationTaxonomy? Taxonomy { get; set; }
}

使用示例

var excludableArea = new AreaFilterValue
{
    Id = 1,
    Label = "上海市",
    Taxonomy = LocationTaxonomy.City,
    IsExcluded = true
};

// 直接访问IsExcluded属性
Console.WriteLine(excludableArea.IsExcluded); // 输出"True"

这种方案的好处是属性直接挂载在实例上,和TS的交叉类型用法更接近,但需要修改原有的Filter子类继承关系。

内容的提问来源于stack exchange,提问作者Hakuna Matata

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:12:49