是的,我知道 Typescript 文档说
因为软件的理想属性是对扩展开放,所以如果可能,您应该始终使用类型别名上的接口。
但说真的,如果我正在制作一个简单的类型,而将其用作可扩展的东西的意图为零,那么将其编码为接口是没有意义的。
对不起,我不明白你的意思。 这是功能请求还是错误报告?
在 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
应该删除这个过于自以为是的规则配置,作为下一个主要版本的重大更改
我怎样才能覆盖这个选项?
@sibelius在tslint.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
关于覆盖规则,我更喜欢强制我使用类型而不是接口的选项,甚至更好,只有在我的反应中定义Props
或State
时才强制我使用类型零件。
我编写的 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?! 🤣
最有用的评论
我知道我可以覆盖它,但我强烈认为该建议是不正确的。
这是我的看法。 在很多情况下,接口不能用作类型别名。 您只能使用接口来键入对象文字。 如果我要遵循推荐的最佳实践,那么在我可能有多个类型别名的特定类文件中,有些是类型别名,有些是接口。 偶然发现这个类的人会想知道到底发生了什么,以及我是否打算在某个地方实现/扩展接口,或者至少期望它是一种可能性。
在我看来,使用类型别名作为类型别名并使用接口作为接口会更简洁,而不是在某些情况下仅仅因为接口具有一些额外的功能(我不需要如果只需要一个类型别名)。
我想我应该针对打字稿文档写一个问题,我会这样做,但我认为可以在这里应用一些工程判断,而不是仅仅因为文档说你应该实施规则。