あなたのコメントを拡大するには、Andrew Li(正解でなければならない)の答えに、実際にあなたが作成したコーナーをOVER-TYPINGで固定しました。
それはあなたが明示的にすべてのものを入力して、しかし、あなたが実際に矛盾をできるように余分なスペースを提供していることで、余分な安全でいるように見えるかもしれ
をFUNCように見えていた:。
function func (obj: Thing, x): string {
return x(obj);
}
ご使用のバージョンや設定に応じてうまく機能している(または「何の示唆もない」と訴えている)かもしれません。
あなたがしたことは、システムを安楽化させるために使い捨てを提供したかったので、一致しなかったタイプを提供することでした。
私は対立する、または何かをすることを意味するものではありません。私たちはすべてそれを犯しています。しかし、タイプシステムを癒す必要があると、私たちはいつも怠惰になります。
私はそれを見て苦痛が少ない方法は、このようになると主張するだろう:あなたはVSCodeにそれをロードした場合、私はあなたと愉快に驚くだろうと確信している
interface Transform<A, B> {
(x:A):B;
}
interface Thing {
a: number;
b: boolean;
c: string;
}
type ThingC = Transform<Thing, string>;
const x = (obj: Thing) => obj.c;
const func = (obj: Thing, x: ThingC) => x(obj);
const c = func({ a: +!0, b: !0, c: "I work fine." }, x);
あなたがそれから得る情報を入力してください。
タイプは実際にメソッドシグニチャーのためのものです。
あなたはもちろん、彼らの周りのツーリングをしたい場合は、constsに型情報を追加すること自由に感じなさい:
const obj: Thing = { a: 1, b: true, c: "Yes" };
をしかし、それは最も有益だところそれは本当にありません。特にobj
がOtherThing
のような異なるタイプのものであっても、の基準を満たしていても、それは何も知らずに何も知らなくても、それはまだx
またはfunc
に入る可能性があるからです。あなたがどんなタイプミスをした場合、あなたに大声になるだろう、と今でも、あなたはまだ厳密されリテラルで関数を呼び出しているタイプ -
interface Transform<A, B> {
(x:A):B;
}
interface Apply<A, B> {
(x:A, f: Transform<A, B>):B;
}
interface Thing {
a: number;
b: boolean;
c: string;
}
const x: Transform<Thing, string> = obj => obj.c;
const f: Apply<Thing, string> = (obj, x) => x(obj);
const c = f({ a: 1, b: true, c: "" }, x);
:でも、より一般的な場合ことを確認するために
チェック
何かが欲しいですか?
const g = <A, B>(o: A, x: Transform<A, B>):B => x(o);
const d = g({ a: 1, b: true, c: "" }, x);
あなたはそれが扱っていたものの種類についてg
ANYTHINGを教えてくれませんでした。これは無名関数であり、匿名型があり、変換が渡されます。
それは、まだはd
に返さなっているどのタイプを知っている、そしてそれはまだ(関係なく、どのようなクラスのそれがあるか、それが持っているものインタフェース)o
がThing
であることを知っています。これは、それがx
からそれらのタイプを引っ張って、後方に働いたので、これを知っています。
は、だから今、あなたは持っている:
interface Transform<A, B> { (x:A):B; }
interface Thing { a: number; b: boolean; c: string; }
const x = (obj: Thing) =>
obj.c;
const g = <A, B>(o: A, x: Transform<A, B>):B =>
x(o);
const d = g({ a: 1, b: true, c: "" }, x);
そして、それまだはd
権利を取得します。
このようなタイプを使用することは、直観に反するかもしれませんが、タイプ・システムを手作業で喜ばせるのではなく、実際にタイプ推論の強みに頼ることで、余分なノイズは、それが持つべきと考えるものと衝突する可能性があります。
'x:(someObj:Thing)=> string'ですか?あなたはインタフェース 'Thing'の1つの引数を取る' x'の署名と一致しなければなりません。 – Li357
ああ、そうです。ヒープをありがとう。私はそれが自分の定義でxのタイピングを宣言して以来、私はそれで終わったと思った。 – chamilton