Γραφομηχανή: void τύπος επιστροφής μετατρέπεται σε οποιονδήποτε τύπο;

ψήφοι
17

Μου φαίνεται να είναι σε θέση να κατανοήσει γιατί ο παρακάτω κώδικας δεν προκαλεί σφάλμα:

var rg: {(): void;}[] = [];
rg.push(function():string {return ;})

Δηλώνω ξεκάθαρα ότι ο τύπος θα πρέπει να είναι μια σειρά από λειτουργίες που επιστρέφουν void, όμως θα ωθήσει μια συνάρτηση που επιστρέφει μια εκεί stringκαι όμως ο compiler δεν διαμαρτύρονται. Αν αλλάξω τον ορισμό της rgσε

var rg: {():number;}[] = [];

Ο compiler αρχίζει να διαμαρτύρονται.

Είναι αυτό ένα bug ή μήπως είναι το πώς ο τύπος επιστροφής κενό υποτίθεται ότι εργάζονται (δηλαδή κάτι πάει αν voidχρησιμοποιείται, ουσιαστικά καθιστώντας το ίδιο είδος επιστροφής any);

Δημοσιεύθηκε 06/10/2012 στις 17:34
πηγή χρήστη
Σε άλλες γλώσσες...                            


2 απαντήσεις

ψήφοι
17

Αυτό οφείλεται στη σχεδίαση (θα εξηγήσω γιατί είναι καλό σχεδιασμό σύντομα). Η spec λέει (στο τμήμα 3.6.3, συντομευμένη για λόγους σαφήνειας):

Ένας τύπος S είναι αποδιδόμενο σε μία τύπου Τ, και Τ είναι εκχωρητέο ​​από S, εάν ένα από τα παρακάτω είναι αλήθεια ...

  • S και Τ είναι τύπους αντικειμένων και, για κάθε Μ μέλος στο Τ, ένα από τα παρακάτω είναι αληθές:

    • Μ είναι μια κλήση, την κατασκευή ή υπογραφή δείκτη και S περιέχει μια κλήση, την κατασκευή ή το δείκτη υπογραφή Ν όπου

      • ο τύπος αποτέλεσμα του Μ είναι άκυρη, ή ο τύπος αποτέλεσμα N είναι εκχωρείται με εκείνη του Μ

Σε αυτή την περίπτωση, δοκιμάζουμε αν () => stringμπορεί να αντιστοιχηθεί () => void. Έτσι, είτε stringθα πρέπει να εντάσσονται σε void(δεν είναι), ή voidπρέπει να είναι void(είναι).


Στην πραγματικότητα, ο κανόνας εδώ έχετε τη δυνατότητα να πετάξουν την τιμή επιστροφής , το οποίο είναι σύμφωνο με το πώς π.χ. C ++ αντιμετωπίζει voidστο ψήφισμά πρότυπο.

function decrementWidgetHeight(w: Widget): number {
    // ... returns the new height of the widget
}

function applyToManyWidgets(w: Widget[], change: (x: Widget) => void): void {
    // for each widget in the array, apply 'change' to it
}

// Later...
applyToManyWidgets(widgetsToShorten, decrementWidgetHeight); // Should be allowed?

Όταν περιορίζουν το είδος της changeνα είναι (widget) => void, είμαστε καθιστώντας έτσι ώστε να μπορείτε να περάσετε decrementWidgetHeightμε το δεύτερο επιχείρημα παρά το γεγονός ότι έχει μια τιμή επιστροφής, αλλά εξακολουθούν να διασφαλίσουμε ότι όταν γράφουμε το σώμα της applyToManyWidgets, δεν χρησιμοποιούμε τυχαία το επιστρέψει την αξία του changeπουθενά.

Σημειώστε ότι voidεξακολουθεί να είναι διαφορετική από ό, τι any, γιατί αυτό είναι αμιγής:

function f() { }
var x = f(); // Disallowed, f() is of type 'void'
Απαντήθηκε 06/10/2012 στις 22:06
πηγή χρήστη

ψήφοι
0

Αυτό μοιάζει με ένα bug. Θα πρέπει να ανοίξετε ένα νέο αντικείμενο εργασίας για την έκδοση

Απαντήθηκε 06/10/2012 στις 18:38
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more