Tslint: 不建议使用 interface-over-type-literal

创建于 2017-09-25  ·  18评论  ·  资料来源: palantir/tslint

是的,我知道 Typescript 文档说

因为软件的理想属性是对扩展开放,所以如果可能,您应该始终使用类型别名上的接口。

但说真的,如果我正在制作一个简单的类型,而将其用作可扩展的东西的意图为零,那么将其编码为接口是没有意义的。

API Breaking Change Enhancement

最有用的评论

我知道我可以覆盖它,但我强烈认为该建议是不正确的。

这是我的看法。 在很多情况下,接口不能用作类型别名。 您只能使用接口来键入对象文字。 如果我要遵循推荐的最佳实践,那么在我可能有多个类型别名的特定类文件中,有些是类型别名,有些是接口。 偶然发现这个类的人会想知道到底发生了什么,以及我是否打算在某个地方实现/扩展接口,或者至少期望它是一种可能性。

在我看来,使用类型别名作为类型别名并使用接口作为接口会更简洁,而不是在某些情况下仅仅因为接口具有一些额外的功能(我不需要如果只需要一个类型别名)。

我想我应该针对打字稿文档写一个问题,我会这样做,但我认为可以在这里应用一些工程判断,而不是仅仅因为文档说你应该实施规则。

所有18条评论

对不起,我不明白你的意思。 这是功能请求还是错误报告?

在 Recommended.ts 中 interface-over-type-literal 的默认值为 true。 我认为应该是假的。 不确定这是否构成功能请求或错误:-)

毕竟推荐的预设是自以为是的。 它包含了您在上面发布的最佳实践和建议。
扩展预设时,您可以覆盖建议并根据需要调整配置。

无论如何,禁用该规则将是一项重大更改。 所以不要期望在下一个主要版本之前有任何变化。


澄清一下: interface-over-type-literal只抱怨类型别名声明。

type Foo = {foo: number}; // The rule disallows this
interface Foo {foo: number} // and fixes it to this

let obj: {foo: number}; // This is still allowed

由于类型别名和接口可以(几乎)互换使用,我不明白为什么您更喜欢类型别名。

在相关的说明中:接口曾经被缓存,而像类型别名这样的匿名类型被重新计算以供永远使用。 所以使用类型别名会显着增加编译时间。
下一个 typescript 版本将几乎消除这种性能差距。

我知道我可以覆盖它,但我强烈认为该建议是不正确的。

这是我的看法。 在很多情况下,接口不能用作类型别名。 您只能使用接口来键入对象文字。 如果我要遵循推荐的最佳实践,那么在我可能有多个类型别名的特定类文件中,有些是类型别名,有些是接口。 偶然发现这个类的人会想知道到底发生了什么,以及我是否打算在某个地方实现/扩展接口,或者至少期望它是一种可能性。

在我看来,使用类型别名作为类型别名并使用接口作为接口会更简洁,而不是在某些情况下仅仅因为接口具有一些额外的功能(我不需要如果只需要一个类型别名)。

我想我应该针对打字稿文档写一个问题,我会这样做,但我认为可以在这里应用一些工程判断,而不是仅仅因为文档说你应该实施规则。

我认为应该不鼓励对结构使用 interface 关键字。 这条规则正好相反,所以在地狱里没有办法可以认为是最佳实践。

这是我认为打字稿出错的事情之一,这混淆了接口的概念,它在我使用过的所有其他类型安全语言中的语义意味着“方法/函数/可调用事物的集合”,带有对象签名/鸭型。 接口的使用应该更具限制性,我真的很欢迎 TSLint 规则“interface-must-declare-only-functions”,或者限制较少的“interface-must-declare-at-least-one-function”

纯结构应使用类型运算符声明并使用 & 运算符进行扩展。 名称应以“T”开头:-)

@navels我同意你的反馈,我认为tslint:recommended应该删除这个过于自以为是的规则配置,作为下一个主要版本的重大更改

我怎样才能覆盖这个选项?

@sibeliustslint.json中的"rules"下,将其标记为false

{
    "extends": ["tslint:recommended"],
    "rules": {
        "interface-over-type-literal": false
    }
}

请注意,此问题是跟踪禁用推荐规则集中的规则。 如果您对 TSLint 有一般性问题,请使用 StackOverflow 或 Gitter。

这里有人谈论这个主题https://medium.com/@martin_hotell/interface -vs-type-alias-in-typescript-2-7-2a8f1777af4c

关于覆盖规则,我更喜欢强制我使用类型而不是接口的选项,甚至更好,只有在我的反应中定义PropsState时才强制我使用类型零件。

我编写的 OOP 代码越来越少,以至于我在当前项目中根本没有使用它。
我不希望初学者被推向它。

@dandrei和我只使用接口,当我想描述函数时(我也没有使用 OOP)。

是的,这绝对是错误的,IMO 不应该是推荐的一部分,或者至少不是自动修复的,所以我们可以在它破坏我们的类型之前禁用它。

该建议实际上破坏了代码。 考虑:

type Foo = {
  foo: string
}

interface IndexedObject {
  [key: string]: string
}

function useIndexedObject(object: IndexedObject) {}

const foo: Foo = {foo: "foo"}
useIndexedObject(foo)

上面的代码有效。 在应用 tslint --fix 并将type Foo更改为interface Foo之前,最后一行会产生错误:

Argument of type 'Foo' is not assignable to parameter of type 'IndexedObject'.
  Index signature is missing in type 'Foo'.

IMO,任何破坏代码的规则都不应该成为建议。 哎呀,如果它有可能破坏代码,它甚至不应该成为规则。

不仅如此,它还导致了“接口必须以'I'开头”的规则。

error TS2344: ...
Index Signature is missing in type 'SOME INTERFACE'.

所以我必须使用type

如果您的应用程序有很多type使用量,那么这是违反 SOLID 原则的一个很好的指标。

根据 #4811 删除Type: Breaking Change标签。 现在接受PR!

那么为什么叫 TypeScript,什么时候应该叫 InterfaceScript?! 🤣

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

dashmug picture dashmug  ·  3评论

Ne-Ne picture Ne-Ne  ·  3评论

zewa666 picture zewa666  ·  3评论

jacob-robertson picture jacob-robertson  ·  3评论

ghost picture ghost  ·  3评论