👏

Typescriptを使い慣れた人のためのPython型定義

2023/01/09に公開

pythonのバージョンは3.11を想定しています

環境設定

mypyを使います

基本

この辺はTypescriptユーザーであっても、すぐに分かるかと思います。

sample1 :bool = false
sample2 :int = 3
sample3 :float = 3.14
sample4 :str = 'pie'

# ユニオン
sample5 :int|str

配列(pythonで言うリスト、タプル)

例えばint型のリストなら以下のような書き方

var sample10:number[]
sample10 = [1,2,3] //OK
sample10 = ['a','b','c'] //NG
sample10:list[int]
sample10 = [1,2,3,4] #OK
sample10 = ['a','b',3] #NG

要素の数も決まっているタプルの場合は、要素の数だけ定義を記述します

sample11:tuple[int,int,str] 

sample11 = (1,2,'aaa') #OK
sample11 = (1,'aaa') #NG

オブジェクト(pythonで言う辞書)

keyとvalueのみ定義したい場合

typescriptの場合、typeやinterfaceで型定義ができました。

type ObjSample = {
    [key:string]:String|Number
}

const sample21:ObjSample = {id:1,name:'aaa',age:12} //OK
const sample22:ObjSample = {id:1,name:false,age:12} //NG

pythonの場合は、typeやinterfaceのような型定義の宣言はありませんので、変数宣言時に型を指定する必要があります

sample20:dict[str,int|str]

sample20 = {'id':1,'name':'aaa','age':12} #OK
sample20 = {'id':1,'name':False,'age':12} #NG

オブジェクトの中身も定義したい場合

type Sample10 = {
    id:Number,
    name:String,
    age:Number,
    sex?:Bool # 必須でない項目
}

pythonの場合はTypeDictを引数にとったクラスで定義します。

from typing import TypedDict, NotRequired

class TypeSample(TypedDict):
    id:int
    name:str
    age:int
    sex:NotRequired[bool] # 必須でない項目

sample23:TypeSample = {'id':1,'name':'aaa','age':12} #'sex'はなくてもOK
sample24:TypeSample = {'id':1,'name':'aaa','age':12,'sex':True} #OK
sample25:TypeSample = {'id':1,'name':'aaa'} # ageがないとエラーが出る
sample26:TypeSample = {'id':1,'name':'aaa','age':'12歳'} # ageの型が異なるとエラーが出る

Discussion