打字稿:财产' x'类型' {}'中缺少用于计算密钥

时间:2017-05-16 17:23:13

标签: typescript

这篇打字稿:

enum Field {
    age,
    bugs,
}
interface Foo {
    number_age: number;
    number_bugs: number;
}

function makeFoo():Foo {
    let ret = {};
    let i = 0;
    for (let key in Field) {
        ret['number_'+key] = i++;
    }
    return ret;
}

在编译时抛出此错误:

$ tsc test.ts 
test.ts(16,5): error TS2322: Type '{}' is not assignable to type 'Foo'.
  Property 'number_age' is missing in type '{}'.

但是ret在运行时肯定会有number_age属性。我如何欺骗编译器知道number_agenumber_bugs将在那里或以其他方式更改我的代码以便编译?

3 个答案:

答案 0 :(得分:1)

您可以使用关键字ret

定义Foo将是as元素
enum Field {
    age,
    bugs,
}
interface Foo {
    number_age: number;
    number_bugs: number;
}

function makeFoo():Foo {
    let ret = {} as Foo;
    let i = 0;
    for (let key in Field) {
        ret['number_'+key] = i++;
    }
    return ret;
}

阅读有关type assertions的文档:

  

有时你最终会遇到更多关于a的事情   值比TypeScript的值。通常这会在你知道的时候发生   某个实体的类型可能比其当前类型更具体。

     

类型断言是告诉编译器的一种方式“相信我,我知道什么   我正在做。“类型断言就像在其他语言中的类型转换,   但不会对数据进行特殊检查或重组。它没有   运行时影响,纯粹由编译器使用。 TypeScript假定   你,程序员,你已经对你进行了任何特殊的检查   需要。

类型断言有两种形式。一个是“角括号”语法:

let someValue: any = "this is a string";

let strLength: number = (<string>someValue).length;

另一个是as-syntax:

let someValue: any = "this is a string";

let strLength: number = (someValue as string).length;

两个样本是等价的。使用一个而不是另一个主要是选择偏好;但是,在使用带有JSX的TypeScript时,只允许使用as样式的断言。

答案 1 :(得分:0)

你离这里很远(你还要在number_0上制作number_1Foo属性,是这个吗?)所以它会更多工作比它值得“正确”检查这段代码。只需使用any

function makeFoo():Foo {
    let ret: any = {};
    let i = 0;
    for (let key in Field) {
        ret['number_'+key] = i++;
    }
    return ret;
}

答案 2 :(得分:0)

您应该使用强制转换运算符&lt; TYPE&gt;

enum Field {
    age,
    bugs,
}
interface Foo {
    number_age: number;
    number_bugs: number;
}

function makeFoo():Foo {
    let ret = {};
    let i = 0;
    for (let key in Field) {
        ret['number_'+key] = i++;
    }
    return <Foo>ret; // Here 
}