У машынным праграмаваньні качыная тыпізацыя — гэта прымяненьне тэсту на качку — «Калі нешта ходзіць як качка і квакча як качка, тады, яно павінна быць качкаю» — для вызначэньня магчымасьці выкарыстаньня аб’екта з пэўнай мэтаю. Пры намінатыўнай тыпізацыі аб’ект належыць да дадзенага тыпу, калі ён аб’яўлены як такі (або калі асацыяцыя тыпу з аб’ектам вызначаецца праз такія мэханізмы, як спадкаваньне). Пры качынай тыпізацыі — калі ён мае ўсе неабходныя для гэтага тыпу мэтады і ўласьцівасьці.[1][2] Качыную тыпізацыю можна разглядаць як структурную эквівалентнасць паміж дадзеным аб’ектам і патрэбным тыпам.
Наступны прыклад на Python 3 дэманструе, як любы аб’ект можа выкарыстоўвацца ў любым кантэксьце, пакуль ён здольны на тое, што ад яго патрабуюць.
class Duck:
def swim(self):
print("Качка плыве")
def fly(self):
print("Качка ляціць")
class Whale:
def swim(self):
print("Кіт плыве")
for animal in [Duck(), Whale()]:
animal.swim()
animal.fly()
Вынік:
Качка плыве
Качка ляціць
Кіт плыве
AttributeError: 'Whale' object has no attribute 'fly'
Калі можна ўявіць, што ўсё, што можа плаваць, з’яўляецца качкаю — кіт можа лічыцца качкаю; але, калі таксама патрэбна, каб качка мела здольнасьць лётаць, кіт не можа лічыцца качкаю.
У некаторых мовах са статычнай тыпізацыяй, такіх як Boo[3] й D,[4][5] праверку тыпаў клясаў можна ажыцьцяўляць падчас выканання, а не кампіляцыі.
Качыная тыпізацыя мае падобныя рысы са структурнай тыпізацыяй. Структурная тыпізацыя — гэта статычная тыпізацыі, якая суадносіць тыпы па іх структуры, у той час як качыная тыпізацыя з’яўляецца дынамічнай і суадносіць тыпы толькі па той частцы структуры, да якой звяртаюцца падчас выкананьня.
Мовы TypeScript,[6] Elm[7] і Python[8] у той ці іншай ступені падтрымліваюць структурную тыпізацыю.
Пратаколы й інтэрфэйсы дазваляюць яўна вызначыць мэтады, апэратары й паводзіны аб’екта. Калі зьнешняя бібліятэка рэалізуе нязменную клясу, кліент не можа карыстацца яе экзэмплярам з інтэрфейсам, невядомым гэтай бібліятэцы, нават калі кляса задавальняе патрабаваньням інтэрфэйса. Вядомым вырашэньнем гэтае праблемы з’яўляецца патэрн Адаптэр. У супрацьлегласць гэтаму, пры качынай тыпізацыі аб’ект будзе прыняты непасрэдна без неабходнасьці адаптэра.
Шаблённыя функцыі або мэтады прымяняюць качыны тэст у кантэксьце статычнае тыпізацыі, што сумяшчае ўсе перавагі і недахопы як статычнае так і дынамічнае праверкі тыпаў. Як больш гнуткая качыная тыпізацыя дазваляе рэалізаваць толькі мэтады фактычна выклікаемыя падчас выканання, у той час як шаблёны патрабуюць рэалізацыі ўсіх мэтадаў, нават калі яны застануцца нявыкарыстанымі.
У такіх мовах, як Java, Scala і Objective-C, рэфлексія можа быць выкарыстана для праверкі структуры аб’екта. Напрыклад, Java MethodHandle API можна ўжытае такім чынам.[9]