Bahasa yang diketik secara statis umumnya mengharuskan Anda untuk mendeklarasikan jenis variabel, yang kemudian diperiksa pada waktu kompilasi untuk mengurangi kesalahan. Kata "statis" dalam "diketik secara statis" mengacu pada "analisis kode statis", yang merupakan proses memeriksa kode sebelum menjalankannya. Meskipun dimungkinkan untuk bahasa yang diketik secara statis untuk menyimpulkan jenis variabel dari sisi kanan ekspresi atau parameter aktual, dalam praktiknya sebagian besar bahasa yang diketik secara statis memerlukan jenis variabel untuk dinyatakan secara eksplisit.
Bahasa yang diketik secara dinamis umumnya tidak memerlukan deklarasi variabel untuk memiliki tipe, dan mereka menyimpulkan tipe variabel berdasarkan tipe yang dihitung sebagai hasil dari mengevaluasi sisi kanan setiap pernyataan penugasan atau parameter aktual untuk panggilan fungsi. Karena variabel dapat diberikan beberapa tugas selama masa pakainya, jenisnya dapat berubah dari waktu ke waktu dan inilah mengapa ini disebut "diketik secara dinamis". Selain itu, lingkungan runtime perlu melacak tipe saat ini untuk setiap variabel, sehingga tipe terikat ke nilai daripada dengan deklarasi variabel. Ini dapat dianggap sebagai sistem informasi jenis runtime (RTTI).
Elemen bahasa yang diketik secara statis dan dinamis dapat digabungkan. Sebagai contoh, C # mendukung variabel yang diketik secara statis dan dinamis, dan bahasa berorientasi objek umumnya mendukung down-casting hirarki jenis. Bahasa yang diketik secara statis biasanya menyediakan berbagai cara untuk mem-bypass pengecekan jenis, misalnya dengan menggunakan casting, refleksi, dan pemanggilan dinamis.
Pengetikan Kuat vs. Lemah mengacu pada rangkaian seberapa banyak bahasa mencoba untuk mencegah bug karena menggunakan variabel seolah-olah itu satu jenis ketika itu sebenarnya jenis lain. Misalnya C dan Java adalah bahasa yang diketik secara statis, namun Java menggunakan pemeriksaan tipe yang jauh lebih kuat daripada C. Kode C berikut senang dikompilasi dan dijalankan, dan akan menempatkan nilai acak ke dalam variabel b pada saat runtime, kemungkinan besar menyebabkan bug:
char *a = "123";
int b = (int)a;
Kode Java yang setara akan menghasilkan kesalahan kompilasi, yang umumnya lebih disukai:
String a = "123"
int b = (int)a;