如何使用Typescript创建包含对象的字段的新对象?

时间:2016-04-29 11:51:37

标签: javascript typescript

我有以下的Typescript接口文件,我正在尝试使用其中的WordForm对象创建一个Word类型的简单最小对象:

interface IWord {
    categoryId: number;
    createdBy: number;
    createdDate: any;
    groupId: number;
    ielts: boolean;
    lessonId: number;
    modifiedBy: number;
    modifiedDate: any;
    toefl: boolean;
    toeic: boolean;
    wordForms: IWordForm[];
    wordId: string;
}

interface IWordForm {
    createdBy: number;
    createdDate: any;
    definition: string;
    modifiedBy: number;
    modifiedDate: any;
    posId: number;
    primary: boolean;
    sample1: string;
    sample2: string;
    sample3: string;
    sample4: string;
    sample5: string;
    synoym: string;
    wordFormId: string;
    wordId: string;
}

这没关系:

            wos.word = <IWord>{
                categoryId: 1,
                lessonId: 1,
                groupId: 1,
                toefl: true
            }

但是这给了我一个错误:

            wos.word = <IWord>{
                categoryId: 1,
                lessonId: 1,
                groupId: 1,
                toefl: true,
                wordForm: <IWordForm>{
                   posId: 1
                }
            }
  

严重级代码描述项目文件行抑制状态   错误TS2352都没有输入'{categoryId:number; lessonId:数字;   groupId:number; toefl:boolean; wordForm:IWordForm; ''也不打字   'IWord'可分配给另一个。物业'createdBy'缺失   在类型'{categoryId:number; lessonId:数字; groupId:number;   toefl:boolean; wordForm:IWordForm;   }”。 admin C:\ H \ admin \ admin \ app \ routes \ words.ts 76 Active

     

严重级代码描述项目文件行抑制状态   错误构建:都没有输入'{categoryId:number; lessonId:数字;   groupId:number; toefl:boolean; wordForm:IWordForm; ''也不打字   'IWord'可分配给   其他。 admin C:\ H \ admin \ admin \ app \ routes \ words.ts 76

有人可以帮忙告诉我如何创建一个带有单词形式的单词对象吗?请注意,我知道我的作业中缺少很多参数,但通过演员我认为这应该仍然有用。

2 个答案:

答案 0 :(得分:2)

在您的特定情况下,问题是接口有一个带有IWordForm列表的wordForms属性,但是您提供了一个wordForm(单数)属性,只有一个单词形式,而不是列表。如果您重命名它并将表单包装在列表中,它应该可以工作:

wos.word = <IWord> {
    categoryId: 1,
    lessonId: 1,
    groupId: 1,
    toefl: true,
    wordForms: [{
        posId: 1
    }]
}

更一般地说,这不是铸造如何运作。在这样的情况下,铸造无济于事;当你投射某些内容时,你承诺它具有你提供的类型,如果你可能是正确的(例如将string|number转换为number),那就没问题了,但如果你将any转换为wos.word = <IWord> <any> { categoryId: 1, lessonId: 1, groupId: 1, toefl: true, wordForm: <IWordForm>{ posId: 1 } } ,那么TypeScript将不会允许它知道你肯定是错的(将字符串转换为数字),只有在你可能是对的时候才会这样。

如果你需要正常地避免这种情况,你可以通过首先转换为height来强制TypeScript接受你的正确性,如下所示。没有充分的理由不要这样做! (测试中的存根/嘲讽是我所知道的几个很好的理由之一):

svg

答案 1 :(得分:1)

使每个属性&#34; nullable&#34; (带问号)。

interface IWord {
    categoryId?: number;
    createdBy?: number;
    createdDate?: any;
    groupId?: number;
    ielts?: boolean;
    lessonId?: number;
    modifiedBy?: number;
    modifiedDate?: any;
    toefl?: boolean;
    toeic?: boolean;
    wordForms?: IWordForm[];
    wordId?: string;
}

interface IWordForm {
    createdBy?: number;
    createdDate?: any;
    definition?: string;
    modifiedBy?: number;
    modifiedDate?: any;
    posId?: number;
    primary?: boolean;
    sample1?: string;
    sample2?: string;
    sample3?: string;
    sample4?: string;
    sample5?: string;
    synoym?: string;
    wordFormId?: string;
    wordId?: string;
}

和wordForms是一个数组:

        wordForms: [{
           posId: 1
        }]

而且......你可能不需要在输入时输出类型。