打字稿:默认导出和命名空间双重行为,如Elm中所示

时间:2016-12-18 20:30:13

标签: typescript import elm

在Elm,我们可以写

import Html exposing (Html)

然后我们不需要输入Html.Html,只需要Html就足够了(不合格),从而避免重复。我们仍然可以使用 Html 作为命名空间,例如Html.text(合格)。

我们如何在打字稿中实现这一目标?例如,

person.ts:

interface Person {
  name: string;
  age: number;
}

function isAdult(p: Person): boolean {
  return p.age >= 18;
}

export {
   Person,
   isAdult
};

other.ts:

import * a Person from "./person" 
//Then I want to be able to use both Person.isAdult and Person (as the interface)

1 个答案:

答案 0 :(得分:1)

截至今天(2.1.0),没有办法从使用相同标识符的模块导入定义。换句话说,您不能将Person接口和Person对象作为命名空间导入。

ES2015导入名称空间

从模块中导出类型和功能。

// person.ts
export interface Person {
    name: string;
    age: number;
}

export function isAdult(p: Person): boolean {
    return p.age > 18;
}

现在,您可以使用ES2015导入语法将所有内容作为单个对象导入。这看起来像一个命名空间,但它不是TypeScript的命名空间。

// index.ts
import * as Person from './person';

let person: Person.Person = { name: 'John', age: 20 };

console.log(Person.isAdult(person);

请不要感到困惑,TypeScript中有一项功能用于提供namespaces,但由于ES2015导入语法,现在它已过时。