Open11
TypeScript
VSCodeでプロジェクト全体のエラーチェックをする
shift + cmd + b
プリミティブ型に代入できるが逆はできないtype aliasをつくる
enum RoomPositionIdType { }
export type RoomPositionId = string & RoomPositionIdType
// RoomPositionIdはasするかtype guardで生成する
任意のindex signatureをもつobjectを作成する(mapped types)
const a: { [K in ResourceConstant]?: string } = {}
a[RESOURCE_ENERGY] = "" // ok
a["energy"] = "" // ok
a["fuga"] = "" // ng
let e: Record<Id<Creep>, Id<Creep>> = {}
let k: keyof typeof e
for (k in e) {
}
key列挙
const keys = Object.keys(a) as (keyof typeof a)[]
Utility Types
文字列入力のvalidation
// "int_key=32 string_key=hoge"
try {
const someInt = arguments.int("int_key").parse()
const someOptionalString = arguments.string("string_key").parseOptional()
...
} catch (error) {
return error
}
// 以前のコード
const keyValueArgs = new Map<string, string>()
args.forEach(arg => {
const [key, value] = arg.split("=")
if (key == null || value == null) {
return
}
keyValueArgs.set(key, value)
})
const rawCount = keyValueArgs.get("count")
if (rawCount == null) {
return "Missing count argument"
}
const count = parseInt(rawCount)
if (isNaN(count) === true) {
return "count is not a number"
}
返り値をGenericにするには?
JSにトランスパイルされる段階で型情報は消滅するので基本できない
function some<T>(): T
case hoge = some<Hoge>()
you can add a generics type to the method signature, but the compiler has no way of inferring the type
https://stackoverflow.com/a/37386570
こんな感じ
type ReturnTypeSpecifier = "string" | "number" | "boolean"
type ReturnType<T extends ReturnTypeSpecifier> = T extends "string" ? string :
T extends "number" ? number :
T extends "boolean" ? boolean :
never
const ValueGetter: { [K in ReturnTypeSpecifier]: () => ReturnType<K> } = {
string(): string {
return ""
},
number(): number {
return 0
},
boolean(): boolean {
return false
},
}
function getValue<T extends ReturnTypeSpecifier>(typeSpecifier: T): ReturnType<T> {
const getter = ValueGetter[typeSpecifier] as (() => ReturnType<T>)
return getter()
}
inferという関連項目があるらしいのであとで調べる
Generic Argument
export type IterableArgumentType = "string" | "int"
export type IterableArgument<T extends IterableArgumentType> = T extends "string" ? StringArgument : T extends "int" ? IntArgument : never
function parseList<T extends IterableArgumentType>(argumentType: T): IterableArgument<T> {
...
}
const a = parse("string") // StringArgument
const b = parse("int") // IntArgument
修正されている?
Optional Constructor
できない
例外を投げれば実現できる
複数ファイルでひとつのnamespaceを定義する
= namespaceをファイルをまたいで拡張する
こちらは動作するもののnamespace以下に定義したtypeを外部から使用できない
メンバーの一部のみを変更する
type HasOptionalMember = {
hoge: string | undefined
}
type HasMember = HasOptionalMember & {hoge: string}
function hasMember(obj: HasOptionalMember): obj is HasMember {
return obj.hoge != undefined
}