タグ

型に関するshunkeenのブックマーク (17)

  • TypeScriptでGeneric Typeに対するNarrowingをしたかったけど現在のところ対応していなかった - Mitsuyuki.Shiiba

    2024-11-11 追記ここから ---- TS 5.8で、その1のインデックスアクセス型の方はサポートされそう。その2の方はその対応が入ってもサポートされない。 追記ここまで ---- 最初にまとめ 現在のTypeScript(2024-09-19時点のバージョン5.6.2)では Generics と Control Flow Analysis は、いい感じには連携しないということを学んだ。 どういうこと?その1 Genericsを使って型安全にやりたいなぁと思って、こんなコードを書いてみてもコンパイルエラーになる。 type Mapping = { a: boolean, b: string, } function getValue<K extends "a" | "b">(key: K): Mapping[K] { if (key === "a") { return true; }

    TypeScriptでGeneric Typeに対するNarrowingをしたかったけど現在のところ対応していなかった - Mitsuyuki.Shiiba
    shunkeen
    shunkeen 2024/09/22
    “「タグ付きユニオンのタグを指定して、型安全に値を取り出したい」”/これをごにょごにょ進めていくと多相バリアントになって拡張可能なパターンマッチが書けるようになるやで
  • 空でない配列を型で表現する正しい方法【TypeScript】

    { 0: T }という型は「0番目の要素がT型であり、必ず存在する」ことを表します。 配列はオブジェクトでもあり、オブジェクトのプロパティ名に数値も使えるというTypeScriptの言語仕様を巧みに活かした型定義です。 しかしこの型定義ではスプレッド構文を使うと「空でない」という情報が型から消えてしまいます。 例えば次のように配列のシャローコピーを作ると型から{ 0: T }の部分が消えます。 type NonEmptyArray<T> = T[] & { 0: T } // ↓string[]型になる😥 NonEmptyArray<string>型にはならない type Spreaded = [...NonEmptyArray<string>] const array: NonEmptyArray<string> = ['a', 'b'] // ↓型エラーになってしまう😥 [...a

    空でない配列を型で表現する正しい方法【TypeScript】
    shunkeen
    shunkeen 2023/08/02
    先頭と末尾だけ考慮するでOKなら、先頭だけの型定義も仕様によってはOKなんじゃなかろうか。例えば、[...array, 4, …array]のように中間に要素を追加した場合を、この記事で提案している型定義も捉えきれていないし。
  • 直和型の代わりにユニオン型を持つ静的型付け関数型言語 Cotton

    // 割る2をする関数の引数が偶数であることを型によって強制する例(実用性はない) data O // 数字の0を表すデータ型 data S(A) forall { A } // +1を表すデータ型 // 型エイリアス type Nat = O | S[Nat] // 非効率すぎる他倍長整数 type Even = O | S[Odd] type Odd = S[Even] // 偶数を引数にとって2で割った結果を言語組込みの整数として返す関数 div2 : Even -> I64 = // 網羅性チェックつきのパターンマッチ | O => 0 | S(S(n)) => 1 + n.div2 TL;DR ユニオン型は直和型の上位互換である(追記あり)。関数型言語を作るときは直和型の代わりにユニオン型を採用するのもあり。 はじめに Cottonというプログラミング言語を2021年の夏頃から作

    直和型の代わりにユニオン型を持つ静的型付け関数型言語 Cotton
    shunkeen
    shunkeen 2023/02/03
    あー、パターンマッチできるユニオン型。稀によく、めちゃくちゃ欲しくなる機能のやつ。A | B | Cの型があって、A は簡単な処理でB | Cは途中まで一緒の複雑な処理だと、B | Cを切り出したくなるし、それができる。のか?
  • My new error...

    2023 年度の僕のエラーハンドリング について書きたい。 昨日Safe Data Fetching in Modern JavaScriptを読んでいて、fetch に限った話ではないが一家言ある内容だったので書きたくなった。 おそらくやりすぎだとか非効率と言われる点はあると思うので、みんなの一家言も教えて欲しい。 対象は Typescript での サーバー開発想定だが、TS であればクライアント開発にもほとんどに当てはまる話だと思う。 例外のスローではなく Result 型を使う Result は失敗するかもしれないという文脈を与えてくれる型 エラーハンドリングの戦略として例外を投げるのではなく、Result 型を返すやり方がある。 Result 型というのは export type Result<T, E> = Ok<T> | Err<E>; export interface Ok

    My new error...
    shunkeen
    shunkeen 2023/01/19
    モナドや鉄道指向の話は脇においておくとして。単なる値のほうが型が付けやすいし、対処方法を単なる関数として書きやすいし、ライブラリも再利用しやすいのはありそう。まあ、チームで合意を取るのが一番大事か
  • 【TypeScript】配列の型を絞り込むときはflatMapがおすすめ

    こんにちは。 スペースマーケットでフロントエンドエンジニアをしているmizukiです! 今回はタイトルの通り、配列で型を絞る際にflatMapを使うのがおすすめだよ!といった話をします。 配列から特定のデータを排除する 例えば、配列からnullableな値を消したいとします。 その場合は以下のようなコードになります。 const nullableArray: Array<string | null> = ['hoge', null, 'fuga'] const array = nullableArray.filter((data) => { return !!data }) ただ、この場合だと型定義としてはnullが排除されたことを認知できず、変数arrayの型は引き続きArray<string | null>と認識されてしまいます。 isを使って型を絞り込む 先ほどの場合、期待値としては

    【TypeScript】配列の型を絞り込むときはflatMapがおすすめ
    shunkeen
    shunkeen 2022/12/29
    MonadPlus的なアレね([]がmzeroになるからfilterできる的な曖昧な知識)。しかし、そこまで型を気にするなら`flatMap(x => x == null ? [] : [x])`と書きそうなもんだが、どうなんじゃろか。`[x]`にしないと予期せぬ平坦化がおきそう…
  • TypeScript 10年の歩み - Qiita

    Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article? TypeScriptは、2022/10/01に10周年を迎えました。 ということで、それを記念してMicrosoftの中の人が振り返りのエントリーを書いていました。 以下は該当の記事、Ten Years of TypeScriptの紹介です。 Ten Years of TypeScript 2022年10月1日は、TypeScript10歳の誕生日です。 10年前の今日、2012年10月1日に、TypeScriptは初めて公にされました。 The Early Days 初めてTypeScriptが表に現れたとき、それももっともなことでし

    TypeScript 10年の歩み - Qiita
    shunkeen
    shunkeen 2022/12/21
    “型なんか最初は全部anyでかまいません。こんなこと言うとすぐプロとかエキスパートとかいう人たちが棍棒で殴りかかってくるのですが華麗に無視しましょう。”/笑った。漸進的型付けに合わせた漸進的導入とな
  • TypeScriptにおける配列の共変性

    const animal: Animal = { animal: "string", }; const dog: Dog = { animal: "string", dog: "string", }; いま,Dog <: Animalです. <:という記号は2つの型のあいだに書いて,「左の型が右の型のサブタイプである」と読みます. TypeScriptの型システムは構造的なので,2つのオブジェクトがサブタイプ関係にあるには,それらに共通するプロパティについてもまた,サブタイプ関係が必要1です. 今回の例では,DogとAnimalに共通するanimalプロパティについてstring <: stringなのでOKです. TSでは,T型の変数にS型の値を代入する際,S <: Tが検査されます。 例えば,Animal型の変数にDog型の値を代入する際,Dog <: Animalが検査されますが,こ

    TypeScriptにおける配列の共変性
    shunkeen
    shunkeen 2022/12/15
    “「反変」ってなんて読むのが正しいんですかね?私は過去「はんぺん」と読んでいたのですが,ある日知り合いから「おでんかよwww」とバカにされたのが悔しくて「はんへん」に矯正したという事情があります”
  • TypeScript で実行時の入力を含む文字列を型で弾く - Object.create(null)

    TypeScript (4.7 時点) において, 文字列に付けられる型には以下の 3 つ (とそのユニオン型) があります. 文字列型 string 文字列リテラル型 ("foo" など) テンプレートリテラル型 (`data-${string}` など) これらのうち, 実行時の入力, 特に事前にパターンが想定されていないような任意の入力が含まれるような文字列に対しては, string や string を含むテンプレートリテラル型を付けることはできても, 文字列リテラル型を付けることはできません. 文字列リテラル型を付けるためには型検査時 (実行の前) に入力文字列の内容がわかっている必要があるので, まあそれはそうですね. このことを利用して, 実行時の入力を含む文字列を与えようとすると型検査に失敗するような関数を作ることができそうです. まずは与えられた型が文字列リテラル型, ま

    TypeScript で実行時の入力を含む文字列を型で弾く - Object.create(null)
    shunkeen
    shunkeen 2022/08/13
    “与えられた型が文字列リテラル型, または文字列リテラル型のユニオン型かどうかを判定する述語が定義できます. できるんです.”>スゲ〜。#ZigLang のcomptime装飾子みたいなものを#TypeScript の型再帰関数で実現できるのか
  • 「プロを目指す人のためのTypeScript入門」読書感想

    @uhyo さんのTSということで読んでいます。 一応入門書という位置づけなので、社内での育成に活用したい目線。 とはいえ自分でも学べるところ多そう、特にTSのd.tsみたいなモジュールまわり理解弱いので… 全体的な感想 4章(関数)、6章(高度な型)が特によかった。 (5章が入ってないのは自分がクラス使わないからなので、使う人だったら5章も入ってると思う) 自分も何年かフロントエンドエンジニアとしてやっているのでさすがにだいたいは知っている内容のおさらいになったけど、それでもふわっとした理解が適切に言語化だったり、コーナーケースの知らない挙動など発見は沢山あった。 特に育成には有用だなと思った。6章の内容は理論と実践の話のバランスが良く、レベル的にもそれなりにTS書いてる人でも知らないこと全然ありそうな内容だったので、自分のチームのメンバーにも少なくとも6章は読んでもらいたい。勧めます

    「プロを目指す人のためのTypeScript入門」読書感想
    shunkeen
    shunkeen 2022/05/06
    感想読んでたら面白そうすぎてポチった。実務ではまったくTypeScriptを書かないけど型の絞り込みが気持ち良すぎてつい触ってしまう
  • プロを目指す人のためのTypeScript 本の感想 #ブルーベリー本

    2章はプログラミング初心者に式と文という概念を伝えるのによさそう。コンパイラの概念が透けてみえるようになる。 let を避けろというコラムわかる。 BigInt の解説するんだ。 全体的にJSの言語仕様をTSという側面から解釈しつつ学ぶ、という構成になってる。この構成が初学者に伝わるかというと、完全なJS初学者には無理で他のプログラミング言語の経験は多少要求される。 3章 object への型注釈の文法解説が結構しんどく感じた。文法的に似てるがそれ故に混乱する。そういえば自分も複雑なインラインの型書いてると、今型なのかインスタンスなのか、結構間違ってる気がするので、言語自体が抱える特徴かもしれない。 type と interface の使い分け、今となっては何が何だかわからない気がした。type がない時代があってそれ以降は〜と書いてあるけど、昔の type はジェネリクスとれなくて、途中

    プロを目指す人のためのTypeScript 本の感想 #ブルーベリー本
    shunkeen
    shunkeen 2022/04/20
    パターンマッチの別世界線>“オブジェクト型リテラルとユニオンのコントロールフロー解析が他の言語と比べたときにTSが明らかに異質に発達してる部分なので、型システム詳しい人にこそ、その部分を楽しんでほしい”
  • Haskellと余代数(Coalgebra) - 朝日ネット 技術者ブログ

    ここではHaskellの中級者向けのトピックを簡単に取り上げたいと思います。 今回は余代数(Coalgebra)についてです。Haskellを書いていると『余(なんとか)』という言葉をみかけることがあります。これは英語の接頭辞 Co- の訳で、ここでは代数(Algebra)の双対(Dual)という意味で余代数と呼ばれています。 さてHaskellやOCamlのデータ型は一般に代数的データ型(Algebraic data type)と呼ばれます。このデータ型にパターンマッチングを加えて、(オブジェクト指向言語などと比較したときの)関数型言語の特徴と紹介されることも多いと思います。実はこのデータ型にはもともと余データ(Codata)と呼ばれるような相方がいたのですが、人類が扱うには早すぎたのか、データ型に比べると余データは長らく影の存在でありました(ちなみに余データは口語上はコデータと呼ぶかも

    Haskellと余代数(Coalgebra) - 朝日ネット 技術者ブログ
    shunkeen
    shunkeen 2022/04/14
    余再帰を知ってから、再帰的なファイルの列挙とか、ゲーム木の探索がしっくりくるようになった>“再帰処理を通常の再帰(recursion)と対比して区別したいときは余再帰(co-recursion)と呼ぶことがあります”
  • プログラミング言語Flixに関するMagnus Madsen氏へのインタビュー

    原文(投稿日:2022/02/25)へのリンク Flixは多くのプログラミング言語にインスパイアされたオープンソースのプログラミング言語であり、開発者は関数型、命令型、論理型のスタイルでコードを書くことが可能である。FlixはScalaに似ており、Hindley-Milnerに基づく型システムとGoにインスパイアされた並行処理モデルを採用している。JVM言語はポリモーフィックエフェクトシステムやDatalog制約などのユニークな機能をサポートしている。 FlixのプログラムはJVMバイトコードにコンパイルされ、開発者はFlix Visual Studio Code拡張機能を使用するか、online playgroundを使用して言語を評価することができる。 コミュニティはいくつかの原則に基づいて言語を開発している。例えば、NULL値を使わない、デフォルトでprivate、リフレクションを使

    プログラミング言語Flixに関するMagnus Madsen氏へのインタビュー
    shunkeen
    shunkeen 2022/03/10
    言語仕様はまったく確認していないけど、かっこいい事だけはわかった>“主に関数型言語でありながら、命令型プログラミングを完全にサポートし、さらに論理プログラミングのひねりを加えた言語”
  • A Proposal For Type Syntax in JavaScript - TypeScript

    Today we’re excited to announce our support and collaboration on a new Stage 0 proposal to bring optional and erasable type syntax to JavaScript. Because this new syntax wouldn’t change how surrounding code runs, it would effectively act as comments. We think this has the potential to make TypeScript easier and faster to use for development at every scale. We’d like to talk about why we’re pursuin

    shunkeen
    shunkeen 2022/03/10
    「例えば“function add(a: number, b: number)”みたいに型が書いてあっても、ブラウザは型を無視して実行しようぜ!無視してくれればトランスパイル不要でTypeScriptが動く!開発時は型検査もある!最高っしょ?」みたいな提案
  • PrismaPromise とは何か

    はじめに Node.js の TypeScript-friendly な ORM である Prisma についての記事です。Prisma では PrismaPromise 型の値がよく使われており、それについて調べたことと、その設計が素晴らしい点をまとめています。 クエリの実行タイミング 次のような User モデルが定義されているとき、

    PrismaPromise とは何か
    shunkeen
    shunkeen 2021/12/31
    構築と実行を分離して、最適化を間に挟む感じ?>“transaction に対応したすべてのクライアントメソッド”、”は PrismaPromise を返しており、 .then が呼び出されるまで”、”クエリを実行せずに事前準備することができる”
  • Shiikaの型システム - メタクラスとジェネリクス

    こんばんは。yharaです。メリークリスマス!記事は言語実装 Advent Calendar 2021最終日の記事です。昨日は@sisshiki1969さんのrurubyのガベージコレクタとアロケータでした。 Shiikaの2021年 Shiikaは私が作っている静的型付け言語です。今年はenum、パターンマッチ、Maybe型といろいろ機能を足しました。来年はModuleと型推論をやる予定で、そこまでできると当初考えていた言語仕様が一通り揃います。いやー楽しみですね。はやくShiikaで実用的なプログラムを書きたい。 全てがオブジェクト ShiikaはRubyの影響を強く受けており、Rubyの「手触り」を静的型言語で再現できないか?というのを考えています。その一環として、Rubyのもつ「全てがオブジェクト」という特徴を受け継いでいます。 Rubyでは全ての値がオブジェクトで、たとえば整数

    Shiikaの型システム - メタクラスとジェネリクス
    shunkeen
    shunkeen 2021/12/28
    “「クラスもオブジェクト」という特徴を引き継いでいます”、“Array<Int>をArray.<>(Int)、すなわち「Arrayの<>メソッドをIntを引数に呼び出す」と定義する”/クラスもオブジェクトだから型引数ではなく値の引数にできるのか
  • Lensだけで作るニューラルネットワーク

    これは、FOLIO Advent calendar 2021 の15日目の記事です。 圏論を機械学習に応用する話題の一つとしてLensで微分可能プログラミングを実装する話を紹介したいと思います。とはいえ圏論など気にせずLensを使ったニューラルネットワークを実装していきます。学習モデル、誤差関数、学習係数などの基的な構成要素が全てLens(ParaLens)として実装できる様子を楽しんでいただければと思っています。 Lensって何? Lensはいわゆる getter と setter を組み合わせたデータ構造です。すなわち型sのデータ型から型aの値を取り出すgetter s -> a と、型sのデータ型を型aの値で更新して新しい型sのデータ型を作成するsetter (s, a) -> s から成っています。

    Lensだけで作るニューラルネットワーク
    shunkeen
    shunkeen 2021/12/16
    “Lensは双方向のデータフローを合成可能な形でうまく表現できるため、今回紹介した微分可能プログラミングを始め確率的プログラミング等いわゆる帰納プログラミングの考え方ととても相性がいい”/なるほど🤔わから
  • TypeScriptの型定義で麻雀の役判定をする 【dwango Advent Calendar 2日目】 - MANA-DOT

    このエントリは ドワンゴ Advent Calendar 2021 2日目の記事です(夜が明けるまでは2日目!)。 はじめに TypeScriptには Conditional Types や Template Literal Types といったクッソ強力な型機能があります。 これらを用いて、今回は 2p3p4p2m3m4m2s3s4s4s5s6s8s8s のような天鳳牌譜形式の文字列を型引数に渡すと、麻雀の役判定をする型(あくまで型です、関数ではありません)を作ってみようとおもいます。 (ただし時間がなかったため断么九と平和のみです)。 Conditional Types, Template Literal Types って何? それぞれ具体的にどんなものか、マニュアルの例を用いて示すと、以下のような感じです。 // Conditional Types の例 interface Anim

    TypeScriptの型定義で麻雀の役判定をする 【dwango Advent Calendar 2日目】 - MANA-DOT
    shunkeen
    shunkeen 2021/12/03
    “TypeScriptには Conditional Types や Template Literal Types といったクッソ強力な型機能があります”/クッソ強力なことがこれでもかとわかるし面白い
  • 1