如何在 Typescript 方法中访问构造函数参数

How to access a constructor parameter inside a Typescript method

我的 Typescript Class 包含过滤定义为构造函数参数的集合的方法 getProductAttributeByName(name: string)

class Product {
    id: string;

    constructor(productDto: IProductDto) {
        this.id = productDto.id;
    }

    getProductAttributeByName(name: string): ProductAttribute {
        // I need productDto (the constructor parameter) here:
        return productDto.productAttributes.filter(x => x.name === name)
    }
}

这是不允许的,所以目前我正在做:

class Product {
    id: string;
    productDto: IProductDto;

    constructor(productDto: IProductDto) {
        this.id = productDto.id;
        this.productDto = productDto;
    }

    getProductAttributeByName(name: string): ProductAttribute {
        return this.productDto.productAttributes.filter(x => x.name === name)
    }
}

不用说这太糟糕了。我公开了一个只在方法内部需要的 public 属性 ,唯一的原因是我无法访问构造函数参数。出于绝望,我也尝试将 属性 声明为 private,如下所示:

class Product {
    id: string;
    private productDto: IProductDto;

    constructor(productDto: IProductDto) {
        this.id = productDto.id;
        this.productDto = productDto;
    }

    getProductAttributeByName(name: string): ProductAttribute {
        return this.productDto.productAttributes.filter(x => x.name === name)
    }
}

但这并没有改变 属性 在对象初始化后仍然可以访问的事实:

var product = new Product(myDto);
// product.productDto is accessible!

有没有一种方法可以在方法内部访问构造函数参数,而无需声明 public 可以访问的 属性?

"Just because my method cannot access a constructor parameter…" 正在以错误的方式思考这个问题。在实例化您的 class 时,productDto 是您实例的重要状态吗? productDto 中的数据是否包含 Product 在其生命周期内需要的重要信息?然后,您不仅试图在构造函数和某些方法之间传递它,而且该数据是对象状态的一部分。您的对象方法使用并依赖于该状态。并且对象状态始终由对象属性实现,因此在 this.productDto 上保存 productDto 是完美的,也是正确的方法。

But this doesn't change the fact that the property is still accessible once the object has been initialized.

那又怎样?使用 TypeScript 和 private 声明,TypeScript 将确保您不会通过尝试从外部代码访问 属性 而搬起石头砸自己的脚。这就是你所需要的。实际尝试强制执行不可访问性是没有意义的。你只会为了几乎没有任何收获而竭尽全力。许多 Javascript 对象都有内部状态,如果您愿意,可以四处查看。完全没问题。

如果您实际上是针对这些不应属于官方 API 的内部属性编写代码,并且该内部实现会发生变化,这只是一个问题。不要那样做。同样,TypeScript 的 private 可以帮助您准确执行此操作。

this.id = productDto.id;
this.productDto = productDto;

这很多余。很明显,稍后在其他方法中您需要 productDto.id productDto。只需将整个 productDto 存储为 属性 并根据需要访问其 .id。如果您需要在 class 上将 id 公开为 属性,请使用 get 方法,其中 returns this.prodctDto.id 可能是一个明智的想法:

class Product {
    private productDto: IProductDto;

    constructor(productDto: IProductDto) {
        this.productDto = productDto;
    }

    get id(): string {
        return this.productDto.id;
    }

    getProductAttributeByName(name: string): ProductAttribute {
        return this.productDto.productAttributes.filter(x => x.name === name)
    }
}

一般来说,尝试设计您的 classes 而不先编写构造函数。写下所有 构造函数。设计您的 class 需要哪些内部和外部属性,以及您的方法将从哪些属性获取数据。然后,作为最后一步,编写您的构造函数,它需要确保对象状态使您的所有方法都能按设计工作。然后 "passing from constructor to method" 的想法就自动消失了。