no-override-props
@azure-tools/typespec-azure-resource-manager/no-override-propsWarns when a model redefines a property that is already defined in one of its base models. Repeating inherited properties in a child model is an anti-pattern for Azure APIs and can cause problems with OpenAPI tooling and some language representations of the models.
Overriding an inherited property is allowed when:
- The overriding property has the same type as the inherited one (by identity). Type aliases resolve to the same underlying type, and template instantiations are cached, so this naturally covers cases such as redefining
systemData: SystemData(alias) where the parent usessystemData: Foundations.SystemData, or the implicittags: Record<string>cloned into a model that usesis TrackedResource<...>. - Both the inherited property and the overriding property are compatible scalars β that is, both reduce to the same scalar family (
string,numeric, orboolean). For example, an inherited property of typestringmay be overridden by astring, by a scalar that extendsstring, by a string literal, by a string-valued enum, or by an open or closed string union.
β Incorrect
Section titled ββ Incorrectβ@armProviderNamespacenamespace MyService;
model InnerBase { a: string;}
model InnerDerived extends InnerBase { b: string;}
model Base { nested: InnerBase;}
model Child extends Base { nested: InnerDerived; // narrows the inherited "nested" to a derived model}β Correct
Section titled ββ Correctβ@armProviderNamespacenamespace MyService;
model Base { id: string; commonProp: string;}
model Child extends Base { otherProp: string;}β Correct (compatible scalar override)
Section titled ββ Correct (compatible scalar override)β@armProviderNamespacenamespace MyService;
@discriminator("kind")model Pet { kind: string; weight: int32;}
model Cat extends Pet { kind: "cat"; // allowed: string and string literal are compatible scalars meow: boolean;}