-
Notifications
You must be signed in to change notification settings - Fork 12.9k
Open
Labels
In DiscussionNot yet reached consensusNot yet reached consensusSuggestionAn idea for TypeScriptAn idea for TypeScript
Description
Note some related issues for doing this with properties rather than methods: #3667, #6118, #1373.
Goal
We want to make it easier for users to derive types without rewriting the same parameter signature every time
class Base {
method(x: number) {
// ...
}
}
class Derived extends Base {
method(x) {
// 'x' should have the type 'number' here.
}
}
Potential ideas
- Only enable in
noImplicitAny
(doesn't work for default initializers 😞) - Revert to
any
in all locations, opt in with another strictness flag (😞) - Something else? 😕
Potential issues
Default initializers with more capable derived types
class A {
a = 1;
}
class B extends A {
b = 2;
}
class Base {
method(x: A) {
// ...
}
}
class Derived extends Base {
method(x = new B) {
x.b;
// Today, 'x' has type 'B' which is technically unsound
// but that's just what we do. Does changing this to 'A' break things?
}
}
Default initializers that become less-capable via contextual types
class Base {
method(x: "a" | "b") {
// ...
}
}
class Derived extends Base {
method(x = "a") {
// We have to make sure 'x' doesn't have type '"a"'
// which is both unsound and less useful.
}
}
Distinction between properties and methods
Would this work?
class Base {
method = (x: number) => {
// ...
}
}
class Derived extends Base {
method(x) {
// Does 'x' have the type 'number' here?
}
}
What about this?
class Base {
method(x: number) {
// ...
}
}
class Derived extends Base {
method = (x) => {
// Does 'x' have the type 'number' here?
}
}
Keywords: base type derived contextual contextually inherit methods implicit any
mattmccutchen, rifler, awinogradov, edvald, sokra and 123 more
Metadata
Metadata
Assignees
Labels
In DiscussionNot yet reached consensusNot yet reached consensusSuggestionAn idea for TypeScriptAn idea for TypeScript