type-annotate-public-apis
Same as type_annotate_public_apis in Dart lints
- Group
- Style
- Path
lint/style/type-annotate-public-apis- Default
- On (recommended)
- Origin
- Dart lints
- Rule
- 443 of 512
Requires type annotations on public declarations.
A public API's types are part of its contract; leaving them to inference
(or dynamic) makes the contract implicit and easy to break. Public
top-level functions and methods need a return type (setters and
operator []= excepted), their parameters need types, and public fields
and top-level variables need a declared type unless they are const, or
final with an initializer whose inferred type is neither dynamic nor
Null. Parameters of public constructors of public, non-enum classes are
checked too.
Missing operator return types highlight the operator name alone.
var answer = 42; // flagged
install(id, url) {} // flagged
final pi = 3.14; // ok: inferred `double`
void install(String id) {} // ok
The analyzer's visitor also descends into the initializers of untyped fields and top-level variables, flagging closure parameters and locals declared there; falcon checks only the declarations themselves, since those nested names are not public API.
Invalid
// @dart = 3.13
var answer = 42;
final nothing = null;
late final pending;
install(String id) {}
void register(id, String url) {}
typedef Handler(event);
class Widget {
var count = 0;
static var shared;
Widget(key);
build() => null;
void update(value) {}
get label => '';
set label(v) {}
operator +(Widget other) => this;
}
// Primary constructors retain their written parameters, including modifiers.
class PrimaryFinal(final x);
class PrimaryVar(var x);
class PrimaryNamed.named(x);
class PrimaryPlain(x);
class PrimaryOptional({p});
class PrimaryTypeName(final Widget);
class PrimaryTypeNamePlain(Widget);
extension type Representation(i) {}
typedef void LegacyTypeName(int); var answer = 42;var answer = 42;final nothing = null;final nothing = null;late final pending; install(String id) {} void register(id, String url) {} typedef Handler(event);class Widget { var count = 0; var count = 0; static var shared; static var shared; Widget(key); Widget(key); build() => null; build() => null; void update(value) {} void update(value) {} get label => ''; get label => ''; set label(v) {} set label(v) {} operator +(Widget other) => this;// Primary constructors retain their written parameters, including modifiers.class PrimaryFinal(final x);class PrimaryFinal(final x);class PrimaryVar(var x);class PrimaryVar(var x);class PrimaryNamed.named(x);class PrimaryNamed.named(x);class PrimaryPlain(x);class PrimaryPlain(x);class PrimaryOptional({p});class PrimaryOptional({p});class PrimaryTypeName(final Widget);class PrimaryTypeName(final Widget);class PrimaryTypeNamePlain(Widget);class PrimaryTypeNamePlain(Widget);extension type Representation(i) {} typedef void LegacyTypeName(int);Valid
// @dart = 3.13
const version = '1.0';
final pi = 3.14;
final name = 'falcon';
var _private = 1;
int count = 0;
void install(String id) {}
_helper(x) {}
typedef void Handler(Object event);
class Widget {
final int size;
static const limit = 4;
final title = 'widget';
var _cache;
Widget(this.size, {String? key});
Widget._internal(x) : size = 0;
_render(x) {}
void update(int value, [_]) {}
int get label => size;
set label(int v) {}
Widget operator +(Widget other) => this;
operator []=(int i, int v) {}
}
class _Hidden {
_Hidden(x);
}
enum Kind {
a(1);
final int v;
const Kind(this.v);
}
void main() {
local(x) {}
local(1);
print([_private, _Hidden(1), _helper]);
}
// Function-typed formals are not regular formals; the public-API helper stops
// at that boundary even when their nested parameter types are omitted.
void nestedTypeName(void g(int)) {}
void nestedUntyped(void cb(x)) {}
typedef void NestedCallback(void cb(x));
typedef ModernCallback = void Function(dynamic x);
class TypedPrimary(var int x);
class FinalPrimary(final String value);
class _PrivatePrimary(x);
class PrivateNamedPrimary._hidden(x);
class WildcardPrimary(_, __);
extension type TypedRepresentation(int value) {}
// Enum constructors are not public APIs, including declaring parameters.
enum PlainPrimaryEnum(p) {
one(0)
}
enum DeclaringPrimaryEnum(final p) {
one(0)
}Configure type-annotate-public-apis
Set its severity in falcon.json. See the configuration guide.
{
"linter": {
"rules": {
"style": {
"type-annotate-public-apis": "error"
}
}
}
}Or silence one occurrence with a suppression comment; the reason is required.
// falcon-ignore lint/style/type-annotate-public-apis: <reason>More style rules
- type-init-formals
type_init_formalsrecommendedFlags a *redundant* type annotation on an initializing formal or super parameter (
type-init-formals, adopted from package:lints). - unawaited-futures
unawaited_futuresrecommendedFutureresults inasyncbodies must be awaited or markedunawaited. - unintended-html-in-doc-comment
unintended_html_in_doc_commentrecommendedFlags angle-bracket text in doc comments that Markdown would render as an HTML tag.
- unnecessary-await-in-return
unnecessary_await_in_returnAvoid
awaiton a returnedFuturethe function's ownFuturealready covers. - unnecessary-brace-in-string-interps
unnecessary_brace_in_string_interpsrecommendedFlags
${x}string interpolations whose braces can be dropped. - unnecessary-breaks
unnecessary_breaksrecommendedFlags a trailing
breakin a switch case that already ends implicitly. - unnecessary-constructor-name
unnecessary_constructor_namerecommendedFlags a redundant
.newon constructor declarations and invocations. - unnecessary-final
unnecessary_finalDon't use
finalfor local variables and parameters.