22

型付きオブジェクトを直接リテラルにする方法はありますか?

直接とは、型注釈が付けられた変数に割り当てる必要がないことを意味します。

たとえば、次のようにできることがわかっています。

export interface BaseInfo { value: number; }

export interface MyInfo extends BaseInfo { name: string; }

function testA(): BaseInfo = {
   const result: MyInfo = { value: 1, name: 'Hey!' };
   return result;
}

私もこのようにすることができます:

function testB(): BaseInfo = {
   return { value: 1, name: 'Hey!' };
}

しかし、私が必要とするのは次のようなものです:

function testC(): BaseInfo = {
   return { value: 1, name: 'Hey!' }: MyInfo; // <--- doesn't work
}

またはこのように:

function testD(): BaseInfo = {
   return MyInfo: { value: 1, name: 'Hey!' }; // <--- doesn't work
}
4

5 に答える 5

21

オブジェクト リテラルのメンバーのインテリセンスは、式のコンテキスト型(仕様のセクション 4.19 を参照) によって提供されます。

さまざまな方法でコンテキスト タイプを取得できます。コンテキスト型が適用される最も一般的な場所のいくつかは次のとおりです。

  • 型注釈付きの変数の初期化子
  • return戻り値の型の注釈を持つ関数または getter内のステートメント内の式
  • 型アサーション式の式 ( <T>expr)

あなたの例では、型アサーションを使用して、オブジェクト リテラルにコンテキスト型を強制することができます。

function testB() {
   return <IMyInfo>{ name: 'Hey!' };
}
于 2013-10-18T18:51:14.477 に答える
16

答えは、アイデンティティ関数を使用することです:

function to<T>(value: T): T { return value; }
const instance = to<MyInfo>({
    value: 1,
    name: 'Hey!',
});

to関数は JIT コンパイラーによって最適化されるため、関数の呼び出しによるパフォーマンスへの影響はありません。

于 2016-06-25T14:51:08.440 に答える
2

インターフェイスはダック タイピングに従うことに注意してください。オブジェクトがインターフェイスに一致するように見える場合、それは実際にインターフェイスに一致します。

そう

function testB(): IBaseInfo = {
   return { name: 'Hey!' };
}

とまったく同じです

function testA(): IBaseInfo = {
   var result: IMyInfo = { name: 'Hey!' };
   return result;
}

いずれにせよ、返されたオブジェクトは IMyInfo のように見えるため、IMyInfo です。関数内で発生することは、一致するインターフェイスに影響しません。

ただし、あなたの例では、関数の戻り値は IBaseInfo であるため、コンパイラとインテリセンスはオブジェクトが単なる IBaseInfo であると想定します。関数の呼び出し元に戻り値が IMyInfo であることを知らせたい場合は、関数 IMyInfo の戻り値を作成する必要があります。

function testB(): IMyInfo = {
   return { name: 'Hey!' };
}

または型推論を使用して、単純に

function testB() = {
   return { name: 'Hey!' };
}
于 2013-10-18T23:59:45.963 に答える
2

タイプセーフにするためには、次の方法があります。

インターフェースの例:

interface IFoo {
  firstName: string;
  lastName: string;
}

関数の結果の型を指定する

function useResultType(): IFoo {
  return {
    firstName: 'mars'
    // compile error, when lastName is missing
    // , lastName: 'xx'
  };
}

定数を返す

function resultVariable() {
  const result: IFoo = {
    firstName: 'mars'
    // compile error, when lastName is missing
    // , lastName: 'xx'
  };
  return result;
}

一般的な同一性関数を使用します(注: rxjs には同一性関数があります)

function ident<T>(value: T): T {
  return value;
}
function identityFunction() {
  return ident<IFoo>({
    firstName: 'mars'
    // compile error, when lastName is missing
    // , lastName: 'xx'
  });
}

型アサーションのみを使用する場合- 他の型を返す場合、コンパイラはエラーを表示しません (例では、lastNameメンバーを「忘れた」など) 。

function asCast() {
  return {
      firstName: 'mars'
    // NO error
  } as IFoo;
}

function cast() {
  return <IFoo>{
      firstName: 'mars'
    // NO error
  };
}

Typescript Playgroundで例を確認できます

于 2018-10-25T12:34:47.560 に答える
1

最初と 2 番目の例は失敗するので、それはできません。:)

リテラルに型を指定する必要がないことを確認してください。リテラルがインターフェイスの要件を満たしている限り、問題ありません。

interface IMyInfo { name: string; }
var asdf = {
   name: "test"
}

var qwer: IMyInfo = asdf;

インテリセンスが必要な場合は、次のようにする必要があります。

ここに画像の説明を入力

または多分これはあなたが探しているものです。Intellisense は、少なくとも遊び場では機能します。

ここに画像の説明を入力

または多分これ。:)

ここに画像の説明を入力

于 2013-10-18T18:00:42.290 に答える