typescript迭代接口属性

Chr*_*ris 27 javascript typescript

我需要将接口属性映射到对象:

    interface Activity {
        id: string,
        title: string,
        body: string,
        json: Object
    }
Run Code Online (Sandbox Code Playgroud)

我目前这样做:

   headers: Array<Object> = [
            { text: 'id', value: 'id' },
            { text: 'title', value: 'title' },
            { text: 'body', value: 'body' },
            { text: 'json', value: 'json' }
        ]
Run Code Online (Sandbox Code Playgroud)

这变得非常重复.我想要的是这样的:

   headers: Array<Object> = Activity.keys.map(key => {
       return { text: key, value: key }
   })
Run Code Online (Sandbox Code Playgroud)

Nit*_*mer 15

你不能,接口仅用于编译时,因为javascript不支持它.

你能做的是:

const Activity = {
    id: "",
    title: "",
    body: "",
    json: {}
}

type Activity = typeof Activity;
const headers: Array<Object> = Object.keys(Activity).map(key => {
    return { text: key, value: key }
});
Run Code Online (Sandbox Code Playgroud)

(游乐场代码)

  • @LukeWilliams第一个(`const`)定义是一个值,第二个是类型定义。例如,如果您没有第二名,那么您将这样做:`let a:Activity;`,您将收到以下错误:`“找不到名称'Activity'”`。编译器将在不同的时间/位置使用这些定义。 (3认同)
  • 只需删除“type Activity = typeof Activity;”行。`Object.keys` 仅适用于对象,不适用于类型。 (3认同)
  • 也许一个明显的问题 - Activity 的第二个声明(作为类型)如何不影响第一个声明(作为常量)? (2认同)

qba*_*ler 7

如果您想保留界面功能,您可以执行以下操作,@Nitzan Tomer 是对的。接口是类型系统的一部分,因此它们仅在编译时相关,因为它们在转译代码中被省略。

class Activity {
    public id: string = '';
    public title: string = '';
    public body: string = '' ;
    public json: Object = {};
}

let activity = new Activity()

const headers: Array<Object> = Object.keys(activity).map(key => {
    return { text: key, value: key }
});

console.log(JSON.stringify(headers))
Run Code Online (Sandbox Code Playgroud)


Vla*_*tko 6

如果您可以在编译期间添加它,并且使用TypeScript> = 2.4.1,则可以尝试此处建议的方法。

基本上,您应该像基本的一样添加ts-transformer-keys依赖项自定义转换器,并且可以列出如下属性:

import { keys } from 'ts-transformer-keys';

interface Props {
    id: string;
    name: string;
    age: number;
}
const keysOfProps = keys<Props>();

console.log(keysOfProps); // ['id', 'name', 'age']
Run Code Online (Sandbox Code Playgroud)

  • 我怎样才能在一个纯打字稿项目中使用它......一个没有 webpack 的项目? (2认同)
  • 非常棒的建议!我能够在 Gulp 脚本中使用它来非常轻松地进行编译。如果您需要参考我的代码片段,请访问:https://github.com/Sitetheory/stratus/blob/fa288b81d3860c40795b89ca9c1c4b17cdcf9f41/gulpfile.js#L28-L38 (2认同)