Created
July 13, 2018 23:22
-
-
Save matanlurey/9c0b30f65e8cf84d3107bdc8d23c8dcf to your computer and use it in GitHub Desktop.
An example of my proposal to ban/lint "covariant Function"
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
void main() { | |
// [1] Will fail at runtime. | |
var cell1 = new Cell1(); | |
try { | |
cell1.registerCallback((String foo) {}); | |
} on TypeError { | |
print('cell1.registerCallback() failed'); | |
} | |
// [2] Will fail statically. | |
var cell2 = new Cell2(); | |
// ERROR: (String) => Null can't be assigned to (dynamic) => void. | |
cell2.registerCallback((String foo) {}); | |
// [3] User intended (hardest to remember to do). | |
var cell3 = new Cell3(); | |
cell3.registerCallback((String foo) {}); | |
} | |
typedef void CellValueChanged<T>(T value); | |
class Cell1 { | |
CellValueChanged _valueChanged; | |
void registerCallback(covariant Function callback) { | |
_valueChanged = callback; | |
_valueChanged(null); | |
} | |
} | |
class Cell2 { | |
CellValueChanged _valueChanged; | |
void registerCallback(void Function(dynamic) callback) { | |
_valueChanged = callback; | |
_valueChanged(null); | |
} | |
} | |
class Cell3 { | |
CellValueChanged _valueChanged; | |
void registerCallback<V>(void Function(V) callback) { | |
_valueChanged = (dynamic value) => callback(value); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment