2016-10-31 2 views
0

Я хочу описать следующую форму объекта в машинописном тексте, но я хочу игнорировать типы полей.Опишите только форму объекта в машинописном тексте, но игнорируйте типы

interface TestInterface { 
    TestOne?: string; 
    TestTwo?: number; 
    TestThree?: boolean; 
} 

Моя идея состояла в том, чтобы описать это следующим образом:

type Shape = { [fieldName: string]: any }; 

type ShapeType<TShape extends Shape> = TShape; 

var test: ShapeType<TestInterface> = { 
    TestThree: "asdf", 
} 

Он должен жаловаться на что-то вроде:

var test: ShapeType<TestInterface> = { 
    TestThree: "asdf", 
    TestFour: "123", 
} 

Если я типаж "ASDF" любому он работает. Есть ли способ описать это так, чтобы кастинг не нужен?

Редакция: Идея заключается в том, чтобы иметь форму, которая обычно используется для обмена данными, но при особых случаях она будет использоваться для метаданных. В тех случаях я забочусь только о структуре, но не о типе (по крайней мере на данный момент - идея состоит в том, чтобы изменить типы фигуры на другой заданный тип).

ответ

2

как понятие, я не вижу преимуществ объявлять что-то, чтобы быть boolean и назначая его как string ...

Но мы можем настроить его так:

//type ShapeType<TShape extends Shape> = TShape; 
interface Shape { [fieldName: string]: any }; 

// now, TestInterface also contains [fieldName: string] 
interface TestInterface extends Shape { 
    TestOne?: string; 
    TestTwo?: number; 
    TestThree?: boolean; 
} 


type ShapeType<TShape extends Shape> = TShape; 

// BTW - why we declared TestsThree to be boolean 
// if we assign it to string... that would hardly help 
var test: ShapeType<TestInterface> = { 
    TestsThree: "asdf", 
} 

Или, если мы не хотим, чтобы форма была интерфейсом,

// we have to do this explicitly [fieldName: string] 
interface TestInterface { 
    [fieldName: string]: any 
    TestOne?: string; 
    TestTwo?: number; 
    TestThree?: boolean; 
} 

type Shape = { [fieldName: string]: any }; 

type ShapeType<TShape extends Shape> = TShape; 

var test: ShapeType<TestInterface> = { 
    TestsThree: "asdf", 
} 

Оба подхода будут работать, но снова .. Почему мы будем определять TestThree ?: boolean;, а затем назначьте его как TestsThree: "asdf",?

+0

Относительно причины: Обычно форма должна использоваться для обмена данными, но я также хотел бы поместить метаданные в эти поля. Поэтому я хотел бы снова использовать форму. – Eggi

+0

У решения, похоже, есть проблема, что он позволяет добавлять новые поля, такие как «TestFour», без жалоб. – Eggi

Смежные вопросы